python 面向对象之类的继承

python中什么是继承:

新类不必从头编写

新类从现有的类继承,就自动拥有了现有类的所有功能

新类只需要编写现有类缺少的新功能

继承的好处:

复用已有代码

自动拥有了现有类的所有功能

只需要编写缺少的新功能

继承的特点:

子类和父类是is关系

python继承的特点:

总是从某个类继承

不要忘记调用super().init

class People(object):
    def __init__(self, name,age):
        self.name = name
        self.age = age

    def eat(self):
        print("%s is eating..." % self.name)

    def talk(self):
        print("%s is talking..." % self.name)

    def sleep(self):
        print("%s is sleeping..." % self.name)

#继承父类
class Man(People):
    pass

m1 = Man("Alin",21)
m1.eat()

执行输出:

Alin is eating...

之类还可以自己定义方法

class People(object):
    def __init__(self, name,age):
        self.name = name
        self.age = age

    def eat(self):
        print("%s is eating..." % self.name)

    def talk(self):
        print("%s is talking..." % self.name)

    def sleep(self):
        print("%s is sleeping..." % self.name)

#继承父类
class Man(People):
    def go_to_work(self):
        print("%s is go_to_work..." % self.name)

m1 = Man("Alin",21)
m1.eat()
m1.go_to_work()

执行输出:

Alin is eating...

Alin is go_to_work...

之类可以定义和父类同名的方法

#继承父类
class Man(People):
    def go_to_work(self):
        print("%s is go_to_work..." % self.name)

    def sleep(self):
        print("Man is sleeping...")

m1 = Man("Alin",21)
m1.eat()
m1.sleep()

执行输出:

Alin is eating...

Man is sleeping...

调用父类方法

#继承父类
class Man(People):
    def go_to_work(self):
        print("%s is go_to_work..." % self.name)

    def sleep(self):
        People.sleep(self)
        print("Man is sleeping...")

m1 = Man("Alin",21)
m1.eat()
m1.sleep()

执行输出:

Alin is eating...

Alin is sleeping...

Man is sleeping...

再写一个类,来继承父类

#继承父类
class Man(People):
    def go_to_work(self):
        print("%s is go_to_work..." % self.name)

    def sleep(self):
        People.sleep(self)
        print("Man is sleeping...")

class WoMan(People):
    def get_birth(self):
        print('%s is born a baby...' % self.name)

m1 = Man("Alin",21)

w1 = WoMan("Rose",26)
w1.get_birth()

执行输出:

Rose is born a baby...

那么Woman是否可以执行Man里面的方法呢?

#继承父类
class Man(People):
    def go_to_work(self):
        print("%s is go_to_work..." % self.name)

    def sleep(self):
        People.sleep(self)
        print("Man is sleeping...")

class WoMan(People):
    def get_birth(self):
        print('%s is born a baby...' % self.name)

m1 = Man("Alin",21)

w1 = WoMan("Rose",26)
w1.get_birth()
w1.go_to_work()

执行报错

AttributeError: 'WoMan' object has no attribute 'go_to_work'

子类之间,是无法直接调用的。

现在有了新的需求,Man在实例化的时候,需要多传一个参数,而Woman保持不变。如果直接修改父类,会影响Woman的实例化。那怎么办呢?

需要在Man里面,自己定义参数。

#继承父类
class Man(People):
    def __init__(self,name,age,money):
        #调用父类的初始化
        People.__init__(self,name,age)
        #单独定义一个变量
        self.money = money
        print("%s 一出生,就有 %s money" % (self.name,self.money))

    def go_to_work(self):
        print("%s is go_to_work..." % self.name)

    def sleep(self):
        People.sleep(self)
        print("Man is sleeping...")

class WoMan(People):
    def get_birth(self):
        print('%s is born a baby...' % self.name)

m1 = Man("Alin",21,10)
m1.eat()

w1 = WoMan("Rose",26)

执行输出:

Alin 一出生,就有 10 money

Alin is eating...

调用父类方法,还有另外一种写法,使用super

#继承父类
class Man(People):
    def __init__(self,name,age,money):
        #调用父类的初始化
        #People.__init__(self,name,age)
        super(Man,self).__init__(name,age) #新式类写法

那么有什么区别呢?没有区别,效果是一样的。既然这样,为什么还要用super。是因为

super不用写父类的类名,如果有一天,父类的类名,改变了,那么这一行代码就不用更改了,只需要更改继承的父类名就可以了。

推荐使用super继承父类

#class People: 经典类
class People(object): #新式类
    def __init__(self, name,age):

新式类,必须要加object

super的写法,也是新式类里面的

经典类和新式类,主要是体现在继承上,有些不同。

class People(object): #新式类
    def __init__(self, name,age):
        self.name = name
        self.age = age

    def eat(self):
        print("%s is eating..." % self.name)

    def talk(self):
        print("%s is talking..." % self.name)

    def sleep(self):
        print("%s is sleeping..." % self.name)

class Relation(object):
    def make_friends(self,obj):
        print("%s is making friends with %s" % (self.name,obj.name))
#多继承
class Man(People,Relation):
    def __init__(self,name,age,money):
        #调用父类的初始化
        #People.__init__(self,name,age)
        super(Man,self).__init__(name,age)
        #单独定义一个变量
        self.money = money
        print("%s 一出生,就有 %s money" % (self.name,self.money))

    def go_to_work(self):
        print("%s is go_to_work..." % self.name)

    def sleep(self):
        People.sleep(self)
        print("Man is sleeping...")

class WoMan(People,Relation):
    def get_birth(self):
        print('%s is born a baby...' % self.name)

m1 = Man("Alin",21,10)
w1 = WoMan("Rose",26)
#执行Relation的方法
m1.make_friends(w1)

执行输出:

Alin 一出生,就有 10 money

Alin is making friends with Rose

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python读书笔记

python 数据分析基础 day9-datetime类型常用对象以及函数日期类型的运算

今天是读《python数据分析基础》的第9天,今天将通过python的date模块来总结日期类型。 常用对象以及函数 对象 可通过date模块创建创建以下对象:...

3126
来自专栏程序员与猫

c# 协变和逆变的理解

1. 是什么 1.1 协变 协变指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型。如 string 到 object 的转换。多见于类型参数用作...

2676
来自专栏Golang语言社区

Go语言与面向对象编程

学习Go语言差不多快两个月了,感觉这个过程还是蛮快乐的,翻翻英文资料,写写小程序,总是觉得有好多东西都搞不明白,一步步走下来,却发现,这些迷惑好像也是不可或缺的...

3438
来自专栏Golang语言社区

Go语言与面向对象编程

学习Go语言差不多快两个月了,感觉这个过程还是蛮快乐的,翻翻英文资料,写写小程序,总是觉得有好多东西都搞不明白,一步步走下来,却发现,这些迷惑好像也是不可或缺的...

4417
来自专栏Java帮帮-微信公众号-技术文章全总结

09(02)总结final,多态,抽象类,接口

(4)抽象类的练习 A:猫狗案例练习 B:老师案例练习 C:学生案例练习 D:员工案例练习 /* A: 猫狗案例 具体事物:猫,狗 共性:姓名,...

4206
来自专栏智能算法

Python学习(七)---- 面向对象学习(类)

原文地址: https://blog.csdn.net/fgf00/article/details/52449707 编辑:智能算法,欢迎关注!

1342
来自专栏程序员宝库

UTF-8 为什么会比 UTF-16 浪费?

上帝说:『首先取下栓,然后不多不少数到三。应该数到三,你数到的数字是三。你除了数到三,既不要数到四,也不要数到二,五是数多了。「三」一旦被数到,成为被数到的第三...

2995
来自专栏云霄雨霁

Java--集合类之Vector、BitSet、Stack、Hashtable

1777
来自专栏小詹同学

python | 关于多重继承那些事

继承是面向对象编程的一个重要的方式 ,通过继承 ,子类就可以扩展父类的功能 。和 c++ 一样 ,在 python 中一个类能继承自不止一个父类 ,这叫做 py...

1261
来自专栏我的博客

基数排序

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,...

2986

扫码关注云+社区

领取腾讯云代金券