|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
[code
]class C:
def __getattribute__(self,name):
print('getattribute')
return supper().__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')
supper().__delattr__(name)
[/code]
在这个代码中有几个疑问看不懂。
1.在上述的四个方法当中为什么只有第一个方法有返回语句而其他的都没有返回?在第三和第四的方法中都和第一个方法一样最后调用了基类的方法为什么他们前面不加上return?
2.第一个方法中最后的返回语句(return supper().__getattribute__(name))的必然性或者说他的作用是什么?不加可以吗?没有看出来最后加上的这个返回是返回给谁的并且返回的是什么?
3.举一个初始化的例子:c.x=1 运行的出来的结果是setattr
之后 c.x 运行出来的结果是getattribute
1
可以结合上述初始化例子解答一下我上述的疑惑
1.在上述的四个方法当中为什么只有第一个方法有返回语句而其他的都没有返回?在第三和第四的方法中都和第一个方法一样最后调用了基类的方法为什么他们前面不加上return?
这就要你先了解了解这些魔法方法的具体作用了,因为当你获取一个属性的时候,当然要有个能将值返回出来的方法,也就是 __getattribute__
但是 __setattr__、__delattr__的主要作用是什么呢? 一个是用来设置属性的,一个是用来删除属性的,这些功能没有必要有返回值~ 所以无需设置返回值
2.第一个方法中最后的返回语句(return supper().__getattribute__(name))的必然性或者说他的作用是什么?不加可以吗?没有看出来最后加上的这个返回是返回给谁的并且返回的是什么?
不加不行哈,必须要调用父类的方法,因为我们这里重写了 __getattribute__ 导致 失去了原来的功能
而 __getattribute__ 功能是当你访问类中属性时候,就会自动触发,并返回该属性
当访问一个不存在类中的属性时候,__getattribute__会自动引发一个异常,而这个异常会被 __getattr__ 所捕获,如果你没有调用父类的方法,那么 __getattribute__也就不会有这些功能了
而我们重写的目的就是为了知道这些方法先后顺序,当然要保留功能的完整性
3.举一个初始化的例子:c.x=1 运行的出来的结果是setattr
之后 c.x 运行出来的结果是getattribute
1
c.x 是为这个类设置属性嘛,所以 __setattr__ 会捕获你这个赋值时候的命令,来自动执行 __setattr__ 方法所以打印了 setattr
而 c.x 是访问你之前设置好了的属性 也就是说 这个属性是确实存在的 那么只要访问属性都会调用 __getattribute__
所以打印了 getattribute ,后面的 1 是返回你 x 属性的值;而如果属性不存在还会自动调用 __getattr__ 方法
|
|