|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #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__[name] = 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.
- """
- class Counter:
- def __init__(self):
- super().__setattr__('count', 0)
- def __setattr__(self, name, value):
- if name 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)"""
复制代码 |
|