| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
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)"""
 
 
  复制代码 |   
 
 
 
 |