为达成目的,经常会在类中将一些内置方法进行重写,最常见的例如__setattr__,下面就通过内置属性,来查看重写会带来什么变化
先定义一个测试用的类,代码如下
classbase:def __init__(self):passinspect.getmembers(base):#查看内置属性
打印结果如下
(‘__class__‘, )
(‘__delattr__‘, )
(‘__dict__‘, mappingproxy({‘__module__‘: ‘__main__‘, ‘__init__‘: , ‘__getattr__‘: , ‘__dict__‘: , ‘__weakref__‘: , ‘__doc__‘: None}))
(‘__dir__‘, )
(‘__doc__‘, None)
(‘__eq__‘, )
(‘__format__‘, )
(‘__ge__‘, )
(‘__getattr__‘, )
(‘__getattribute__‘, )
(‘__gt__‘, )
(‘__hash__‘, )
(‘__init__‘, )
(‘__init_subclass__‘, )
(‘__le__‘, )
(‘__lt__‘, )
(‘__module__‘, ‘__main__‘)
(‘__ne__‘, )
(‘__new__‘, )
(‘__reduce__‘, )
(‘__reduce_ex__‘, )
(‘__repr__‘, )
(‘__setattr__‘, )
(‘__sizeof__‘, )
(‘__str__‘, )
(‘__subclasshook__‘, )
(‘__weakref__‘, )
base的内置属性
找到__setattr__,发现他是一个 slot wrapper(是否可以理解为插口包装)
‘__setattr__‘,
对__setattr__进行重写,在赋值的时候打印key与value
def __setattr__(self , key , value):print(key,value)
self.__dict__[key] = value
再次打印,发现__setattr__变为了普通的方法
(‘__setattr__‘, )
总结:在重写内置方法时,内置方法会从slot wrapper变为普通的function,slot wrapper-->function
----------------------------------------------------------------分割线----------------------------------------------------------------
疑问:如果有类继承,父类重写,子类是否也继承?
1 class base: #父类
2 def __init__(self):3 pass
4
5 def __setattr__(self, key, value):6 print(key, value)7 self.__dict__[key] =value8
9 class Foo(base): #子类
10 def __init__(self):11 pass
子类Foo未重写方法
情况1: 子类Foo未重写__setattr__,父类base与子类Foo的内置属性中,__setattr__完全相同
#父类base
(‘__setattr__‘, )#子类Foo
(‘__setattr__‘, )
情况2,子类Foo重写__setattr__方法,二者不同
#父类base
(‘__setattr__‘, )#子类Foo
(‘__setattr__‘, )
,总结:在有继承关系时, 1:父类重写内置方法会影响到所有的子类
2:子类将方法重写后与继承特性相同,会覆盖父类的相同的方法
3:在多重继承中,如果父类都重写了该方法,则会继承写在前面的那个父类的方法(具体请参考我的另一片关于多重继承的文章)
原文地址:http://www.cnblogs.com/bloath/p/7305856.html