Python3里的super()和__class__使用介绍
2015-04-23 09:22
946 查看
子类里访问父类的同名属性,而又不想直接引用父类的名字,因为说不定什么时候会去修改它,所以数据还是只保留一份的好。其实呢,还有更好的理由不去直接引用父类的名字,参见 Python's super() considered super! | Deep Thoughts by Raymond Hettinger。
这时候就该 super() 登场啦――
class A:
def m(self):
print('A')
class B(A):
def m(self):
print('B')
super().m()
B().m()
当然 Python 2 里 super() 是一定要参数的,所以得这么写:
复制代码 代码如下:
class B(A):
def m(self):
print('B')
super(B, self).m()
需要提到自己的名字。这个名字也是动态查找的,在这种情况下替换第三方库中的类会出问题。
super() 很好地解决了访问父类中的方法的问题。那么,如果要访问父类的父类(准确地说,是方法解析顺序(MRO)中位于第三的类)的属性呢?
比如,B 类是继承 A 的,它重写了 A 的 m 方法。现在我们需要一个 C 类,它需要 B 类的一些方法,但是不要 B 的 m 方法,而改用 A 的。怎么间接地引用到 A 的 m 方法呢?使用self.__class__肯定是不行的,因为 C 还可能被进一步继承。
从文档中我注意到,super 的实现是通过插入一个名为 __class__ 的名字来实现的(super 会从调用栈里去查找这个 __class__ 名字)。所以,就像文档里暗示的,其实可以直接在定义方法时访问 __class__ 名字,它总是该方法被定义的类。继续我们的单字母类:
class C(B):
def m(self):
print('C')
# see the difference!
print(__class__.__mro__)
print(self.__class__.__mro__)
__class__.__mro__[2].m(self)
class D(C):
def m(self):
print('D')
super().m()
o = D()
o.m()
会得到:
复制代码 代码如下:
D
C
(<class 't.C'>, <class 't.B'>, <class 't.A'>, <class 'object'>)
(<class 't.D'>, <class 't.C'>, <class 't.B'>, <class 't.A'>, <class 'object'>)
A
不过,PyPy 并不支持这个 __class__ 名字。
您可能感兴趣的文章:
相关文章推荐
- python2.7 使用super关键词 报错 TypeError: must be type, not classobj 解决办法
- python2.7 使用super关键词 报错 TypeError: must be type, not classobj 解决办法
- python Class高级编程:super().__init__使用
- Python数据增强(data augmentation)库--Augmentor 使用介绍
- 第六种方式,python使用cached_property缓存装饰器和自定义cached_class_property装饰器,动态添加类属性(三),selnium webdriver类无限实例化控制成单浏览器。
- Python使用sort和class实现的多级排序功能示例
- Python中__slots__属性介绍与基本使用方法
- Python import与from import使用及区别介绍
- 使用Virtualenv搭建python虚拟开发环境介绍
- python super()使用详解
- Python中工作日类库Busines Holiday的介绍与使用
- 【python】Redis介绍及简单使用
- Python中的MySQLConnector使用介绍
- python弱引用使用介绍
- xgboost+python参数介绍的简单使用
- SuperEasyRefreshLayout的使用介绍
- 关于python使用One Class&nbs…
- Python - Anaconda的介绍 安装 使用
- python中MethodType方法介绍与使用示例
- python内置函数的简单使用和介绍