1. 通常以属性(.)访问

class C:
    def __init__(self):
        self.x = 'X-man'

22 属性访问

2. 通过property()函数访问

class Test:
        def __init__(self, size=10):
            self.size = size
        def getSize(self):
            return self.size
        def setSize(self,value):
            self.size = value
        def delSize(self):
            del self.size
        x = property(getSize,setSize,delSize) 

22 属性访问

3. 属性相关的魔法方法

魔法方法 含义
__getattr__(self, item) 定义当用户试图访问获取一个不存在的属性时的行为
__getattribute__(self, item) 定义当该类的属性被访问时的行为
__setattr__(self, key, value) 定义当一个属性被设置时的行为
__delattr__(self, item) 定义当一个属性被删除时的行为

示例1:

class D:
    def __getattribute__(self, name):
        print('getattribute')
        # 使用super()调用object基类的__getattribute__()方法
        return super().__getattribute__(name)

    def __setattr__(self, name, value):
        print('setattr')
        super().__setattr__(name, value)

    def __delattr__(self, name):
        print('delattr')
        super().__delattr__(name)

    def __getattr__(self, name):
        print('getattr')

22 属性访问
示例2:

class Rectangle:
    def __init__(self, width=0, height=0):
        self.width = width
        self.height = height
    # __setattr__()定义一个属性被设置时的行为
    def __setattr__(self, key, value):
        if key == 'square':
            self.width = value
            self.height = value
        else:
       		# self.name = value
          # 当给self.width和self.height赋值时,触发__setattr__()魔法方法
          # 于是执行else下面的语句,如果此处写self.name = value
          #就又变成self.width = value,相当于反复触发__setattr__()方法形成死循环
            super().__setattr__(key,value)
            #等价于self.__dict__[name] = value

    def getArea(self):
        return self.width * self.height

22 属性访问

相关文章: