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]