调缩进:ctrl + [ 左
ctrl + ] 右
属性访问
property() 可以用属性去访问属性?什么意思。。。
>>> class C:
def __getattribute__(self,name):
print("getattribute")
return super().__getattribute__(name)
def __getattr__(self,name):
print("getattr")
def __setattr__(self,name,value):
print("setattr")
super().__setattr__(name,value)
def __delattr__(self,name):
print("delattr")
super().__delattr__(name)
>>> c = C()
>>> c.x
getattribute 因为c没有定义属性,所以操作c.x时,第一个返回的是getattribute,一旦访问属性,就自动弹出
getattr c没有属性,当操作c.x时,会返回getattr (用户试图获取不存在属性时弹出)
>>> c.x=1 赋值,所以会触动setattr
setattr
>>> c.x 当调用属性时,会自动弹出getattribute,因为已经有属性了,所以getattr就不弹出了
getattribute
1
>>> del c.x 当删除属性时,会弹出delattr
delattr
>>>
当使用属性时,要格外小心死循环。
描述符:就是将某种特殊类型的类的实例指派给另一个类的属性
class Myproperty:
def __init__(self,fget=None,fset= None,fdel=None):
self.fget = fget
self.fset = fset
self.fdel = fdel
def __get__(self,instance,owner):
self.fget(instance)
def __set__(self,instance,value):
self.fset(instance,value)
def __del__(self,instance):
self.fdel(instance)
class C:
def __init__(self):
self._x=None
def getX(self):
return self._x
def setX(self,value):
self._x = value
def delX(self):
delete self._x
x= Myproperty(getX,setX,delX)
练习:
先定义一个温度类,然后定义两个描述符类用于描述摄氏度和华氏度两个属性。两个属性自动转换
class Sheshidu:
def __init__(self,value=26.0): 定义摄氏度,初始温度为26度
self.value = float(value)
def __get__(self,instance,owner):
return self.value
def __set__(self,instance,value):
self.value = float(value)
class Huashidu: 定义华氏度
def __get__(self,instance,owner):
return instance.ssd * 1.8 + 32 instance是实例化对象
def __set__(self,instance,value):
instance.ssd = (folat(value)-32) / 1.8
class Temperature: 定义温度
ssd = Sheshidu() 摄氏度
hsd = Huashidu() 华氏度
第46个视频的课后习题
1 描述符类中,分别通过哪些魔法方法来实现对属性的get、set、delete 操作的
__get__(self,instance,owner) 用于访问属性,它返回属性的值
__set__(self,instance,value) 将在属性分配操作时调用,不返回任何内容
__delete__(self,instance) 控制删除操作,不返回任何内容
这节学的有点糟,后续再回看
继续学习定制序列:
看了一晚上,眼睛都快瞎了啊喂。。
下次看迭代器