python新式类的继承规则有必要记住吗,【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()

注意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.name

if __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.name

if __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.name

if __name__=='__main__':

c=C('hello')

print c.getName()

2.继承有普通继承和super继承两种

3.python类有新式类和经典类

区别:

1)首先,写法不一样:

class A:

pass

class B(object):

pass

2)在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索。

3)新式类更符合OOP编程思想,统一了python中的类型机制。

4)旧类无法使用super

5)新类的类型是type

作者:Jack Twain/Zeno

链接:https://www.zhihu.com/question/22475395/answer/66944861

来源:知乎

python继承和多态

继承 目标 单继承 多继承 面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 继承 实现代码的重用,相同的代码不需要重复的编写 多态 不同的对象调用相同的方法,产生不 ...

python 继承中的super

python继承中子类访问父类的方法(包括__init__)主要有两种方法,一种是调用父类的未绑定方法,另一种是使用super(仅仅对于新式类),看下面的两个例子: #coding:utf-8 cla ...

python继承——封装

python继承--封装 1 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度 2 封装分为两个层面 第一个层面的封装(什么都不用做):创建类和对象会分别创建二者的名称空 ...

python 继承与多重继承

当然,如果不支持python继承,语言特性就不值得称为“类”.派生类定义的语法如下所示: . . . 名称 BaseCl ...

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关键字.首先在本类中查找,如果本类中找不到,再在父 ...

JAVA中继承时方法的重载(overload)与重写/覆写(override)

JAVA继承时方法的重载(overload)与重写/覆写(override) 重载-Override 函数的方法参数个数或类型不一致,称为方法的重载. 从含义上说,只要求参数的个数或参数的类型不一致就 ...

随机推荐

浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)

UDP数据包长度 UDP数据包的理论长度 udp数据包的理论长度是多少,合适的udp数据包应该是多少呢?从TCP-IP详解卷一第11章的udp数据包的包头可以看出,udp的最大包长度是2^16-1的个 ...

Volocity循环高级用法

#foreach($announcementDo in $announcementList) #set($listSize=$!announcementList.size() - 1) #if(($v ...

hdu 5745 La Vie en rose DP + bitset优化

http://acm.hdu.edu.cn/showproblem.php?pid=5745 这题好劲爆啊.dp容易想,但是要bitset优化,就想不到了. 先放一个tle的dp.复杂度O(n * m ...

mysql的过程和Oracle的区别

mySQL 和 Oracle 不一样  , mysql 中的function 中, 没有 CREATE OR REPLACE如果需要用到这句,可以使用 DROP FUNCTION IF EXISTS ...

MFC CVIew关闭时崩溃

记得看视频的时候老师说过    创建CView的时候,也就是创建视图的时候,不要使用  Cview      m_view;这种方式 而是使用Cview  *  pView=new   Cview() ...

BZOJ 3570 动物园

Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习 ...

如何查看SQL Server的数据库实例名

其实一般默认就是MSSQLSERVER  (注意,就是英文大写). 点击开始,运行,services.mcs 然后查阅所有SQL Server的项,其中括号中字符串的就是实例名 reference: ...

发现一个名为“Douyu”的国人项目

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值