常见的就是初始化方法__init__()

python中类的初始化方法是__init__(),因此父类子类的初始化方法都是这个,如果子类不实现这个函数,初始化时调用父类的初始化函数,如果子类实现这个函数,就覆盖了父类的这个函数,既然继承父类,就要在这个函数里显式调用一下父类的__init__(),这跟C++,jAVA不一样,他们是自动调用父类初始化函数的。

调用父类函数有以下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- coding:utf-8 -*-
class Animal():
    def __init__(self, name):
        self.name = name
 
    def saySomething(self):
        print("I am " + self.name)
 
class Dog(Animal):
    def __init__(self, name):
        super().__init__(name)
 
    def saySomething(self):
        print ("I am "+ self.name + ", and I can bark")

  

1.直接写类名调用: parent_class.parent_attribute(self)

2.用 super(type, obj).method(arg)方法调用:super(child_class, child_object).parent_attribute(arg)   【不需要写self】

3.在类定义中调用本类的父类方法,可以直接 super().parent_method(arg)  【个人推崇这种写法】

样例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# -*- coding:utf-8 -*-
# file_name: python_class_inheritance_example.py
class Animal():
    def __init__(self, name):
        self.name = name
 
    def saySomething(self):
        print("I am " + self.name)
 
class Dog(Animal):
    def __init__(self, name):
        super().__init__(name)
 
    def saySomething(self):
        print ("I am "+ self.name + ", and I can bark")
 
    def animal_say_1(self):
        # 子类调用父类的方法
        #  方式1
        super(Dog, self).saySomething()
 
    def animal_say_2(self):
        #  方式2 [推荐]
        super().saySomething()
     
    def animal_say_3(self):
        # 方式3
        Animal.saySomething(self)
 
 
if __name__ == "__main__":
    dog = Dog("Blake")
    dog.saySomething()
    dog.animal_say_1()
    dog.animal_say_2()
    dog.animal_say_3()
    # 子类对象调用被覆盖的父类方法
    super(Dog, dog).saySomething()
 
'''
输出结果如下:
python python_class_inheritance_example.py
I am Blake, and I can bark
I am Blake
I am Blake
I am Blake
I am Blake
'''

如下代码:

class A:
def __init__(self):
self.namea="aaa"
def funca(self):
print "function a : %s"%self.namea
class B(A):
def __init__(self):
self.nameb="bbb"
def funcb(self):
print "function b : %s"%self.nameb
b=B()
print b.nameb
b.funcb()
b.funca()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

运行后会报错:

bbb
function b : bbb
Traceback (most recent call last):
File "D:workbenchpythonMyPythonProjectteststudyoverwrite_method.py", line 19, in <module>
print b.funca()
File "D:workbenchpythonMyPythonProjectteststudyoverwrite_method.py", line 6, in funca
print "function a : %s"%self.namea
AttributeError: B instance has no attribute 'namea'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

两种方法解决: 
- 第一种

class A:
def __init__(self):
self.namea="aaa"
def funca(self):
print "function a : %s"%self.namea
class B(A):
def __init__(self):
#这一行解决了问题
A.__init__(self)
self.nameb="bbb"
def funcb(self):
print "function b : %s"%self.nameb
b=B()
print b.nameb
b.funcb()
b.funca()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 第二种:
#父类需要继承object对象
class A(object):
def __init__(self):
self.namea="aaa"
def funca(self):
print "function a : %s"%self.namea
class B(A):
def __init__(self):
#这一行解决问题
super(B,self).__init__()
self.nameb="bbb"
def funcb(self):
print "function b : %s"%self.nameb
b=B()
print b.nameb
b.funcb()
b.funca()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

PS:让类A继承自object类,这样才能使用super函数,因为这是python的“新式类”支持的特性。当前的class和对象可以作为super函数的参数使用,调用函数返回的对象的任何方法都是调用超类的方法,而不是当前类的方法。

优劣: 
- 方法一更直观,方法二可以一次初始化所有超类 
- super函数比在超类中直接调用未绑定方法更直观,但是其最大的优点是如果子类继承了多个父类,它只需要使用一次super函数就可以。然而如果没有这个需求,直接使用A.init(self)更直观一些。

Python子类调用父类内属性的方法的更多相关文章

  1. [Go] 子类 调用 父类 的 属性、方法

    package main import ( "fmt" ) type A struct { Text string Name string } func (a *A) Say() ...

  2. python子类调用父类的方法

    python子类调用父类的方法 python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法.如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问, ...

  3. python__基础 : 类的继承,调用父类的属性和方法

    1.继承,调用父类属性方法 在python里面,继承一个类只需要这样写: class Animal: def heshui(self): print('动物正在喝水') class Cat(Anima ...

  4. python 子类调用父类成员的方法

    1.直接写类名调用: parent_class.parent_attribute(self) class Animal(): def __init__(self, name): self.name = ...

  5. python 子类调用 父类的构造函数

    class A(object): def __init__(self): self.nameaa = 'aa' def funca(self): print('function a %s' % sel ...

  6. javascript练习-子类调用父类的构造函数和方法

    function NonNullSet(){ Set.apply(this,arguments); } NonNullSet.prototype = inherit(Set.prototype); N ...

  7. Python开发基础-Day20继承实现原理、子类调用父类的方法、封装

    继承实现原理 python中的类可以同时继承多个父类,继承的顺序有两种:深度优先和广度优先. 一般来讲,经典类在多继承的情况下会按照深度优先的方式查找,新式类会按照广度优先的方式查找 示例解析: 没有 ...

  8. python基础之继承实现原理、子类调用父类的方法、封装

    继承实现原理 python中的类可以同时继承多个父类,继承的顺序有两种:深度优先和广度优先. 一般来讲,经典类在多继承的情况下会按照深度优先的方式查找,新式类会按照广度优先的方式查找 示例解析: 没有 ...

  9. python中子类调用父类的方法

    1子类调用父类构造方法 class Animal(object): def __init__(self): print("init Animal class~") def run( ...

随机推荐

  1. 如何将vim打造成Linux下的source insight

    编写者:龙诗科 邮箱:longshike2010@163.com 2016-01-06 众所周知,windows下的source insight是阅读项目代码的神器,其神奇之处在于可以根据当前鼠标所指 ...

  2. zabbix命令之:zabbix_sender命令

    zabbix server除了可以从客户端主动获取数据,客户端也可以主动将数据推送给服务端,客户端通过zabbix_sender指令来实现向服务端主动推送数据. 在zabbix客户端安装 配置yum源 ...

  3. WPF 多个选项卡TabControl 页面分离

    此项目源码下载地址:https://github.com/lizhiqiang0204/TabControl-page-separation 每个页面的按键处理事件直接对应该页面下的cs文件 Main ...

  4. 4.华为路由交换技术_IP路由选择原理(上)

    初始化时,路由表上只有直连路由 查看路由表 严格来讲任何一个具有三层路由功能的设备都有路由表 数据通信往往是双向的的,来回都要考虑. 路由是逐跳的,每一跳都要设置. 实际路由是根据已经分配的网络段进行 ...

  5. MyEclipse内存不足?这里有你想要的问题解决方案

    [MyEclipse CI 2019.4.0安装包下载] No.1 打开MyEclipse目录下的myeclipse.ini文件 在后面修改下面几个属性: vmargs Xms512m ( Java能 ...

  6. Shiro(二)

    1 Shiro的授权 1.1 授权流程 1.2 授权方式 shiro支持三种方式的授权 1.2.1 编程式 通过编写if/else完成授权代码. if(subject.hasRole("ro ...

  7. MySQL5.7数据转移至SQL Server详解

    本文链接:https://blog.csdn.net/qq_37308779/article/details/80679358一.安装MySQL ODBC驱动为MySQL安装Connector/ODB ...

  8. java中System类

    System作为系统类,在JDK的java.lang包中,可见它也是一种java的核心语言特性.System类的构造器由private修饰,不允许被实例化.因此,类中的方法也都是static修饰的静态 ...

  9. springboot(十)使用LogBack作为日志组件

    简介: 企业级项目在搭建的时候,最不可或缺的一部分就是日志,日志可以用来调试程序,打印运行日志以及错误信息方便于我们后期对系统的维护,在SpringBoot兴起之前记录日志最出色的莫过于log4j了, ...

  10. 与HTTP协作的Web服务器——代理、网关、隧道

    1.虚拟主机 (1)HTTP/1.1规范允许一台HTTP服务器搭建多个Web站点: (2)在互联网上,域名通过DNS服务映射到IP地址(域名解析)之后访问目标网站,即当请求发送到服务器时,已经是以IP ...