【python】继承时注意事项
1. __init__ 注意事项
如果父类有__init__函数,子类没有,则子类自动调用父类__init__函数
如果父类有__init__函数,子类也有,则子类必须主动调用父类__init__函数,否则会报错
class A:
def __init__(self):
self.name = "A"
def PrintName(self):
print self.name class B(A):
def __init__(self):
A.__init__(self)
self.__age = 18 obj = B()
obj.PrintName()
下面讲解来源:http://www.cnblogs.com/zyxstar2003/archive/2011/03/21/1989954.html
注意1、__init__并不相当于C#中的构造函数,执行它的时候,实例已构造出来了。
| 
 1 
2 
3 
4 
5 
 | 
class A(object):    def __init__(self,name):        self.name=name    def getName(self):        return 'A '+self.name | 
当我们执行
| 
 1 
 | 
a=A('hello') | 
时,可以理解为
| 
 1 
2 
 | 
a=object.__new__(A)A.__init__(a,'hello') | 
即__init__作用是初始化已实例化后的对象。
注意2、子类可以不重写__init__,实例化子类时,会自动调用超类中已定义的__init__
| 
 1 
2 
3 
4 
5 
6 
7 
 | 
class B(A):    def getName(self):        return 'B '+self.nameif __name__=='__main__':    b=B('hello')    print b.getName() | 
但如果重写了__init__,实例化子类时,则不会隐式的再去调用超类中已定义的__init__
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
 | 
class C(A):    def __init__(self):        pass    def getName(self):        return 'C '+self.nameif __name__=='__main__':    c=C()    print c.getName() | 
则会报"AttributeError: 'C' object has no attribute 'name'”错误,所以如果重写了__init__,为了能使用或扩展超类中的行为,最好显式的调用超类的__init__方法
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
 | 
class C(A):    def __init__(self,name):        super(C,self).__init__(name)    def getName(self):        return 'C '+self.nameif __name__=='__main__':    c=C('hello')        print c.getName() | 
2.继承有普通继承和super继承两种
3.python类有新式类和经典类
class A:
    pass
class B(object):
    pass
2)在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索。
3)新式类更符合OOP编程思想,统一了python中的类型机制。
链接:https://www.zhihu.com/question/22475395/answer/66944861
来源:知乎
【python】继承时注意事项的更多相关文章
- python继承和多态
		
继承 目标 单继承 多继承 面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 继承 实现代码的重用,相同的代码不需要重复的编写 多态 不同的对象调用相同的方法,产生不 ...
 - python 继承中的super
		
python继承中子类访问父类的方法(包括__init__)主要有两种方法,一种是调用父类的未绑定方法,另一种是使用super(仅仅对于新式类),看下面的两个例子: #coding:utf-8 cla ...
 - python继承——封装
		
python继承--封装 1 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度 2 封装分为两个层面 第一个层面的封装(什么都不用做):创建类和对象会分别创建二者的名称空 ...
 - python 继承与多重继承
		
当然,如果不支持python继承,语言特性就不值得称为“类”.派生类定义的语法如下所示: <statement-1> . . . <statement-N> 名称 BaseCl ...
 - Python 多重继承时metaclass conflict问题解决与原理探究
		
背景 最近有一个需求需要自定义一个多继承abc.ABC与django.contrib.admin.ModelAdmin两个父类的抽象子类,方便不同模块复用大部分代码,同时强制必须实现所有抽象方法,没想 ...
 - C#构造函数在继承时必须要求与父类型构造函数入参相同怎么办?
		
摘要 我们都知道,C#中,在类型继承时,由于构造子类必须先构造其父类型的内容,因此,必须子类型的构造函数中调用父类型的构造函数(无参数的不需要显式声明). 但是往往我们会出现,子类型本身的构造函数大于 ...
 - C++使用继承时子对象的内存布局
		
C++使用继承时子对象的内存布局 // */ // ]]> C++使用继承时子对象的内存布局 Table of Contents 1 示例程序 2 对象的内存布局 1 示例程序 class ...
 - python继承
		
Python继承 继承实例: 父类和子类的关系: 继承树: 没有父类就继承object类,不要忘记调用super().__init__来初始化父类 代码: class Person(object): ...
 - JAVA继承时this和super关键字
		
JAVA继承时this和super关键字 本文主要讨论在方法前使用this或super关键字时,编译器在什么地方查找对应的函数. 在子类中指定this关键字.首先在本类中查找,如果本类中找不到,再在父 ...
 
随机推荐
- appium按钮定位,去掉弹出框
			
#coding=utf-8 这个一定要加上,不然脚本中注释中都不能有中文 ''' Created on 2015年7月2日 @author: liujuan ''' import sys reload ...
 - HD1532Drainage Ditches(最大流模板裸题 + 邻接表)
			
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
 - java链接到mysql
			
原文出自 http://qq163230530.blog.163.com/blog/static/4289250620081186262719/ eclipse 下载安装后 新建web项目 首先配置服 ...
 - linux(Debian)下安装与MySql的安装、卸载、配置及使用
			
参考资料:http://www.cnblogs.com/xusir/p/3334217.html 以下是简要记录. 一.安装 安装:apt-get install mysql-server mysql ...
 - 数数字 (Digit Counting,ACM/ICPC Danang 2007,UVa 1225)
			
思路: 利用java 特性,将数字从1 一直加到n,全部放到String中,然后依次对strring扫描每一位,使其carr[str.charAt(i)-'0']++; 最后输出carr[i],即可. ...
 - UIScrollview自动布局,UIScrollviewAutolayoutDemo
			
参考文档:http://www.cocoachina.com/ios/20150104/10810.html UIScrollviewAutolayoutDemo地址:http://pan.baidu ...
 - 锋利的jQuery-6--序列化函数serialize()和serializeArray()在表单提交中的作用
			
在通过jQuery ajax提交表单的时候,通常用下边的方法获取表单内容. var form = 'add-account-form'; //表单id $('#' + form).submit(fun ...
 - Yii2 如何使用事件
			
原文地址:http://www.fancyecommerce.com/2016/04/29/yii2-%E4%BD%BF%E7%94%A8event-1-%EF%BC%8C%E5%A6%82%E4%B ...
 - nginx负载均衡器处理session共享的几种方法(转)
			
1) 不使用session,换作cookie 能把session改成cookie,就能避开session的一些弊端,在从前看的一本J2EE的书上,也指明在集群系统中不能用session,否则惹出祸端来 ...
 - 删除(注意,删除后,后面顶上去,所以id会一直变,所以我们用class来定义,因为id是唯一的)
			
删除de $(".delete").on("click",function(){ var id = $(this).attr("value" ...