高渐飞 发表于 2018-7-18 20:52:49

A-20-属性访问

#coding=UTF-8

#知识点总结
"""
#coding=UTF-8s

1.四种跟属性有关的魔法方法:
    1. __getattribute(self, name): 定义当该类的属性被访问时的行为
    2. __getattr__(self, name): 定义当用户试图获取一个不存在的属性的行为
    3. __setattr__(self, name, value): 定义一个属性被设置时的行为
    4. __delattr__(self, name): 定义一个属性被删除时的行为
注:当访问一个属性时, 会先进入__getattribute__()中, 若属性不存在, 再进入__getattr__()中

2. 重写__setattr__()时应注意无限递归的问题 ,如下"""

class Rectangle():
    def __init__(self,width=0,height=0):
      self.width = width
      self.height = height

    def __setattr__(self, name, value):
      if name == "square":
            self.width = value
            self.height = value
      else:
            #self.name = value   # 语句运行时会再次触发 __setattr__() 调用,导致无限递归。
             self.__dict__ = value
            #super().__setattr__(name, value) #可用,这样定义属性,不会进入__setattr__()中
    def getArea(self):
      return self.width * self.height

r=Rectangle(4,5)
print(r.getArea())
print(r.width,r.height)
r.square=20
print(r.getArea())
print(r.width,r.height)

#3.对于super类, 可用print(dir(super))查看属性,所以当重写__getattr__()时, 如果返回super().__getattr__(name)则会报错

#4.
"""
classCounter:
    def__init__(self):
      super().__setattr__('count', 0)

    def__setattr__(self, name, value):
      ifname not in self.__dict__:
            super().__setattr__('count', self.count + 1)
      super().__setattr__(name, value)

    def__delattr__(self, name):
      super().__setattr__('count', self.count - 1)
      super().__delattr__(name)"""
页: [1]
查看完整版本: A-20-属性访问