6.2 Python class 继承
来源:互联网 发布:.club域名与.com 编辑:程序博客网 时间:2024/05/21 06:38
Python 继承
- Python 继承
- 继承
- 公有保护私有成员
- 参考网址
转载请标明出处(http://blog.csdn.net/lis_12/article/details/52959910).
继承
继承是一种创建新类的机制,目的是专门使用或者修改现有类的行为.被继承的类称为基类或者超类.新类称为派生类或子类.通过继承创建类时,所创建的类将继承其基类所定义的属性,但是,派生类可以重新定义任何这些属性并添加自己的新属性.
在class语句中使用以逗号分隔的基类名称列表来指定继承,如果没有有效的自定义基类,类要继承object(新式类).object是所有Python对象的基类,提供了一些常用方法(如__str__()
)的默认实现.
继承特点:
继承通常用于重新定义基类中已经定义的方法,从而达到代码复用的目的.
在多继承的类中搜索一个属性时,按照方法解析顺序搜索(MRO)来搜索属性.
派生类定义
__init__()
时,不会自动调用基类的__init__()
方法.因此,要由派生类自己调用基类的__init__()
方法来对它们进行恰当的初始化.正因为是自己显示调用__init__()
方法,所以继承顺序与__init__()
方法调用顺序无关啊;如果派生类B重新实现了基类A的fun()方法,但是还想调用基类的fun()方法.为此,有一种方法可以显示地调用基类中的原始方法,将实例self作为第一个参数传递即可,A.fun(self),但是如果出现了多重继承,这样的调用方式容易产生混淆,让人以为是类B实现了fun()方法,见代码:
#!/usr/bin/python# -*- coding: utf-8 -*-class A(object): def f(self): print 'A f'class B(A): passclass C(B): def f(self): B.f(self) print 'C f'def fun(): c = C() c.f()if __name__ == '__main__':#主程序 fun()#'A f' 'C f'
解决上述问题的方案是使用super函数,将B.f(self)替换为super(C,self).fun()即可,super函数会按照MRO查找函数,如果未找到则抛出异常,这种方式更加直白,一看就懂.
公有,保护,私有成员
公有成员:不以_
开头的变量或函数,外部和子类都可以访问;
保护成员:以一个_
开头的变量或函数,按理说只有类内部和子类可以访问,外部不该访问,但是可以访问;
私有成员:以__
开头的变量或函数,只有类的内部才能访问到,子类和外部不能访问.但是可以使用非常手段访问(以_classname__var就能访问到);
详细版解释,下划线的作用
class A(object): a = 0 _b = 1 __c = 2 def __init__(self): self.A = 0 self._B = 1 self.__C = 2 @staticmethod def static_f(): print 'A static_f' @classmethod def class_f(cls): print 'B class_f'class B(A): def __init__(self): super(B,self).__init__()def fun2(): a = B() print dir(a)#['A', '_A__C', '_A__c', '_B', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_b', 'a', 'class_f', 'static_f'] print a.a #0 print a._b #1 #print a.__c error print a._A__c #2, 防止了命名冲突, 如果这里不懂,参考上述链接 print a.A #0 print a._B #1 #print a.__C error print a._A__C #2 a.static_f() #A static_f a.class_f() #B class_f
代码证明一切啊…..
在基类中定义的所有内容都会被派生类继承并且可从派生类访问,即使是私有成员也可以通过特殊方法访问到,但是这种方式不推荐,因为这样会暴露我们不想暴露的内部实现,甚至可能导致在派生类中定义的对象与基类中定义的对象之间发生命名冲突.
参考网址
- http://blog.csdn.net/lis_12/article/details/52859376
- http://blog.csdn.net/lis_12/article/details/52870728
- http://blog.csdn.net/lis_12/article/details/52693115
- 6.2 Python class 继承
- 【Python开发】Python中的class继承
- python的class是否继承object区别
- class类的继承和子类(二) python
- Python-class,继承和多态,异常处理
- 原型继承和Class继承
- Class-----继承理解
- Class的继承
- 【ES6】class的继承
- js class继承
- python class
- Python Class
- Python Class
- Python - class
- Python class
- python Class
- python-class
- Python Class
- C 字符串数组冒泡排序
- LeetCode #421: Maximum XOR of Two Numbers in an Array
- Ubuntu系统下为 intelliJ idea添加启动项,直接在dash中启动即可
- input name and value and type
- Java线程的学习_线程的生命周期
- 6.2 Python class 继承
- 2016 杭州·云栖大会 PDF 下载的一个分享
- 大字符串Remove,Replace方法不適用,導致內存溢出
- 聆听巴赫
- python数据结构学习笔记-2016-10-28-01-带尾指针的链表和排序链表
- 51nod-【1315 合法整数集】
- BFC、IFC、GFC、FFC
- WebScarab拦截WebGoat的请求
- 安卓开发——Intent跳转地图应用(百度地图、高德地图)