Why do managed attributes just work for class attributes and not for instance attributes in python?

后端 未结 3 1255
野的像风
野的像风 2021-01-15 00:00

To illustrate the question check the following code:

class MyDescriptor(object):
  def __get__(self, obj, type=None):
    print \"get\", self, obj, type
             


        
相关标签:
3条回答
  • 2021-01-15 00:36

    To answer your second question, where is _v?

    Your version of the descriptor keeps _v in the descriptor itself. Each instance of the descriptor (the class-level instance SomeClass1, and all of the object-level instances in objects of class SomeClass2 will have distinct values of _v.

    Look at this version. This version updates the object associated with the descriptor. This means the object (SomeClass1 or x2) will contain the attribute _v.

    class MyDescriptor(object):
      def __get__(self, obj, type=None):
        print "get", self, obj, type
        return obj._v
      def __set__(self, obj, value):
        obj._v = value
        print "set", self, obj, value
    
    0 讨论(0)
  • 2021-01-15 00:36

    You should read this and this.

    It overwrites the function because you didn't overload the __set__ and __get__ functions of SomeClass but of MyDescriptor class. Maybe you wanted for SomeClass to inherit MyDescriptor? SomeClass1 prints the "get" and "set" output because it's a static method AFAIK. For details read the upper links.

    0 讨论(0)
  • 2021-01-15 00:39

    I found _v of x1: It is in SomeClass1.__dict__['m']._v

    For the version suggested by S.Lott within the other answer: _v is in x1._v

    0 讨论(0)
提交回复
热议问题