博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day24 02 单继承(派生)
阅读量:5127 次
发布时间:2019-06-13

本文共 3119 字,大约阅读时间需要 10 分钟。

day24 02 单继承(派生)

 

 

1、首先来看一个简单的例子

比如:

  狗类的属性有:吃,喝,看门

  鸟类的属性有:吃,喝,下蛋

看门和下蛋就是这两种动物不同的属性,而吃喝是两个共同的属性

以下代码实现了将一个子类的self传入父类中,然后实现了对共同属性的操作,也实现了不同属性的操作:

class Animal:    def __init__(self):          # 因为狗类中没有可执行的_init_文件,所以执行的是父类的,但是这里的self不再是Animal本身的self了,而是狗类创建的self        print('执行Animal._init_')        self.func()  # 因为传进来的是狗类的self也就是Dog,所以self.func=Dog.func    def eat(self):        print('%s eating'%self.name)    def drink(self):        print('%s drinking'%self.name)    def func(self):        print('Animal.func')class Dog(Animal):  # 创建了狗类的self,但是没有找到自身的_init_文件,所以会向父类中寻找    def guard(self):        print('guarding')    def func(self):        print('Dog.func')dog = Dog()  # 在这里调用的时候,执行的是Animal里面的init文件,但是在执行之前就在狗类里面先创建了一个狗类的selfclass Bird(Animal):    def __init__(self):        pass
执行Animal._init_Dog.func

 

2、继续使用人狗大战的游戏例子

人类和狗类的相同属性:name,blood,aggr

不同属性:人类有sex,money,狗类有kind

它们的相同属性可以放在父类中,而不同的属性放在各自类里面,对相同属性与不同属性的操作如下:

class Animal: # 父类    # 子类拥有的共同属性    def __init__(self,name,blood,aggr):  # 狗和人在游戏中拥有的共同属性种类        self.name = name        self.blood = blood        self.aggr = aggr    # 子类拥有的共同方法    def Eat(self):        print('吃药回血')        self.blood += 100class dog(Animal):  # 子类    def __init__(self,name,blood,aggr,kind):        # dog类拥有的属性全部都传进去,并且创建dog的self,只有自己的init文件中没有的属性才会像父类寻求,即共同属性是通过父类执行        Animal.__init__(self,name,blood,aggr)        # 因为前面已经创建了dog自己的self,所以这里的self就是dog这个对象,执行_init_文件的同时,并将狗的self传入Animal中        self.kind = kind  # 狗类的派生属性,也就是不同于人类的属性,也就是父类中不包括的属性    def bite(self,someone):  # 派生方法        someone.blood -= self.aggr# 下面的人类的有关分析与狗类的相同class someone(Animal):  # 子类    def __init__(self,name,blood,aggr,sex,money):        Animal.__init__(self,name,blood,aggr)        self.sex = sex   # 人类的派生属性,也就是不同于人类的属性,也就是父类中不包括的属性        self.money = money  # 人类的派生属性,也就是不同于人类的属性,也就是父类中不包括的属性    def attack(self,dog):  # 派生方法        dog.blood -= self.aggrdog1 = dog('溜溜球',200,500,'泰迪')print(dog1.name)person1 = someone('王昭君',300,500,'girl',1000)print(person1.name)print(dog1.kind)print(person1.sex)print(person1.money)print(dog1.Eat())print(person1.Eat())print(person1.blood)print(dog1.blood)

运行结果:

溜溜球王昭君泰迪girl1000吃药回血None吃药回血None400300

 

3、小结

  • 父类中没有的属性,在子类中出现叫做派生属性
  • 父类中没有的方法,在子类中出现叫做派生方法
  • 只要是子类的对象调用,子类中有的名字一定用子类的,子类中没有的,才找父类的,如果父类也没有就会报错
  • 如果父类子类都有用子类的
  • 如果还想用父类的,单独调用父类的

4、super关键字

super关键字只在新式类中使用,python3中所有类都是新式类,在使用super的方法调用执行父类的init文件的时候,不需要再传self了:

class animal: # 父类    def __init__(self,name,blood,aggr):  # 狗和人在游戏中拥有的共同属性种类        self.name=name        self.blood=blood        self.aggr=aggrclass dog(animal):  # 子类    def __init__(self,name,blood,aggr,kind):        super().__init__(name,blood,aggr)        # super方法调用执行父类的init文件,并且不用传self,会自动将self传进去,不像前面的Animal._init_的方法还需要传self        # super关键字的使用只在新式类中有,python3中所有类都是新式类        self.kind = kind  # 派生属性    def bite(self,someone):        someone.blood-=self.aggrclass someone(animal):  # 子类    def attack(self,dog):        dog.blood -=self.aggrdog1 = dog('溜溜球',200,500,'泰迪')print(dog1.name)

运行结果:溜溜球

所以在子类当中调用父类方法有:

  • 父类名.方法名:需要自己传self参数
  • super().方法名:不需要自己传self参数

转载于:https://www.cnblogs.com/wxm422562/p/10896998.html

你可能感兴趣的文章
Java Spring学习笔记 01.@Autowired与@Resource区别?
查看>>
python 小试牛刀之信息管理
查看>>
PHPStorm配置自己喜欢的主题
查看>>
小程序爬坑记录-wxml
查看>>
windows服务与控制台应用程序之HttpWebResponse的使用
查看>>
Windows Phone开发(36):动画之DoubleAnimation 转:http://blog.csdn.net/tcjiaan/article/details/7521388...
查看>>
入驻一点资讯
查看>>
在过滤器中设置一个应用范围内的路径
查看>>
C# OOP程序设计目录
查看>>
表变量类型的创建及使用
查看>>
理解JS里的偏函数与柯里化
查看>>
总结get和post区别---面试用
查看>>
js判断当前浏览器
查看>>
玩转HTTP
查看>>
继承 多态 java相关基础知识
查看>>
iter创建一个可以被迭代的对象
查看>>
【uwp】浅谈China Daily中数据同步到One Drive的实现
查看>>
报错:Request failed: unacceptable content-type: text/html
查看>>
iOS- static extern const
查看>>
“软件工程第二次作业—结对编程”
查看>>