网络编程
位置:首页>> 网络编程>> Python编程>> python 子类调用父类的构造函数实例

python 子类调用父类的构造函数实例

作者:homle  发布时间:2023-05-27 22:33:37 

标签: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()

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

python 子类调用父类的构造函数实例

(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()

python 子类调用父类的构造函数实例

(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()

python 子类调用父类的构造函数实例

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)

python 子类调用父类的构造函数实例

补充知识: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 用的是小写 作为模块名称.

来源:https://www.cnblogs.com/homle/p/8724125.html

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com