python调用父类构造函数需要放在第一句吗_python 子类调用父类的构造函数实例...

当子类继承父类后,需要调用父类的方法和属性时,需要调用父类的初始化函数。 class A(object):

def __init__(self):

self.nameaa = 'aa'

def funca(self):

print('function a %s' % self.nameaa)

class B(A):

def __init__(self):

self.namebb = 'bb'

def funcb(self):

print('function b %s' % self.namebb)

b = B()

print(b.namebb)

b.funcb()

print(b.nameaa)

b.funca()

在子类中重写了构造函数,但新的构造函数没有初始化父类,当没有初始化父类的构造函数时,就会报错。

4ce5eb380a31771a7027a3b91a7fa0eb.png

(1)调用超类的构造方法 class A(object):

def __init__(self):

self.nameaa = 'aa'

def funca(self):

print('function a %s' % self.nameaa)

class B(A):

def __init__(self):

self.namebb = 'bb'

A.__init__(self) #添加

def funcb(self):

print('function b %s' % self.namebb)

b = B()

print(b.namebb)

b.funcb()

print(b.nameaa)

b.funca()

6d2ea9549bfb3ced4a9352157d6a40ec.png

(2)使用super函数 class A(object):

def __init__(self):

self.nameaa = 'aa'

def funca(self):

print('function a %s' % self.nameaa)

class B(A):

def __init__(self):

self.namebb = 'bb'

super(B,self).__init__()

def funcb(self):

print('function b %s' % self.namebb)

b = B()

print(b.namebb)

b.funcb()

print(b.nameaa)

b.funca()

4afc9a9e6ed443ce0c2141f6584b5883.png

super函数返回一个super对象,解析过程自动查找所有的父类和父类的父类,当前类和对象可以作为super函数的参数使用,调用函数返回的方法是超类的方法。使用super函数如果子类继承多个父类只许一次继承,使用一次super函数即可。

如果没有重写子类的构造函数,是可以直接使用父类的属性和方法的。 class A(object):

def __init__(self):

self.nameaa = 'aa'

def funca(self):

print('function a %s' % self.nameaa)

class C(A):

pass

c = C()

c.funca()

print(c.nameaa)

8347165ed5e348bd675c9ddc9a43cff7.png

补充知识:python3 和python2 调用父类构造方法写法区别

1. python3 和python2 调用父类构造方法写法区别

前一段时间,把之前的一个项目迁移到python3

发现了很多不同的地方.我这里简单说明了,构造方法的不同 之后可能会继续更新不同. 主要针对项目迁移进行总结,反思. 这里就当做笔记.

python3 代码 调用父类的构造方法 #!/usr/bin/env python3

# -*- coding: UTF-8 -*-

"""

@author: Frank

@contact: frank.chang@shoufuyou.com

@file: py2topy3.py

@time: 2018/7/7 上午7:09

## python3 代码

"""

import threading

import queue

_sentinel = object()

class Consumer(threading.Thread):

"""

消费者线程类

"""

def __init__(self, name, queue):

super().__init__(name=name)

self.queue = queue

def run(self):

while True:

values = self.queue.get(timeout=None)

if values is _sentinel:

self.queue.put(values)

break

##process values

##xxx

print('consume is consuming data {}'.format(values))

print("{} finished".format(self.getName()))

if __name__ == '__main__':

q = queue.Queue()

concumser = Consumer('consumer', q)

print(concumser)

2 python2.7 调用父类的构造方法 #!/usr/bin/env python3

# -*- coding: UTF-8 -*-

"""

@author: Frank

@contact: frank.chang@shoufuyou.com

@file: 3.py

@time: 2018/7/7 上午7:05

"""

import Queue

import threading

# 哨兵

_sentinel = object()

class Consumer(threading.Thread):

"""

消费者线程类

"""

def __init__(self, name, queue):

super(Consumer, self).__init__(name=name)

self.queue = queue

def run(self):

while True:

values = self.queue.get(timeout=None)

if values is _sentinel:

self.queue.put(values)

break

##process values

##xxx

print('consume is consuming data {}'.format(values))

print("{} finished".format(self.getName()))

if __name__ == '__main__':

q = Queue.Queue()

concumser = Consumer('consumer', q)

print(concumser)

区别

主要区别是 super 的变化,

python3 中直接 super().init() 中 super 不需要传递任何参数,直接可以调用父类的构造方法

python2 中 super(Consumer, self).init(), 需要传两个参数一个是类名, 一个是self. 这样比较麻烦,很容易混淆. 但是python3 这里处理的比较好了.

可以看下这个文档 https://docs.python.org/3/library/functions.html#super

顺便提一下, python2 和python3 中 quque 名称换了,python3 用的是小写 作为模块名称.

以上这篇python 子类调用父类的构造函数实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持聚米学院。

Python中,子类可以继承父类构造函数。有几种方法可以实现这一点。 第一种方法是不重写父类的`__init__`方法。当子类实例化时,会自动调用父类定义的`__init__`方法。例如: ```python class Father(object): def __init__(self, name): self.name = name print("name: %s" % (self.name)) def getName(self): return 'Father ' + self.name class Son(Father): def getName(self): return 'Son ' + self.name if __name__ == '__main__': son = Son('runoob') print(son.getName()) ``` 输出结果为: ``` name: runoob Son runoob ``` 第二种方法是重写子类的`__init__`方法。当子类实例化时,不会调用父类已经定义的`__init__`方法。可以在子类的`__init__`方法中添加自己的逻辑。例如: ```python class Father(object): def __init__(self, name): self.name = name print("name: %s" % (self.name)) def getName(self): return 'Father ' + self.name class Son(Father): def __init__(self, name): print("hi") self.name = name def getName(self): return 'Son ' + self.name if __name__ == '__main__': son = Son('runoob') print(son.getName()) ``` 输出结果为: ``` hi Son runoob ``` 第三种方法是在子类的`__init__`方法中调用父类的构造方法,可以使用`super`关键字或父类名称来实现。例如: ```python class Father(object): def __init__(self, name): self.name = name print("name: %s" % (self.name)) def getName(self): return 'Father ' + self.name class Son(Father): def __init__(self, name): super(Son, self).__init__(name) print("hi") self.name = name def getName(self): return 'Son ' + self.name if __name__ == '__main__': son = Son('runoob') print(son.getName()) ``` 输出结果为: ``` name: runoob hi Son runoob ``` 以上是三种常见的继承父类构造函数的方法。具体使用哪种方法取决于你的需求和设计。 #### 引用[.reference_title] - *1* *2* *3* [python子类继承父类构造函数](https://blog.csdn.net/ningjie420/article/details/108676985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值