python内置方法重命名_python 类中内置方法的重写

为达成目的,经常会在类中将一些内置方法进行重写,最常见的例如__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:在多重继承中,如果父类都重写了该方法,则会继承写在前面的那个父类的方法(具体请参考我的另一片关于多重继承的文章)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值