python面向对象之继承/多态/封装

老师说,按继承/多态/封装这个顺序来讲。

子类使用父类的方法:

#!/usr/bin/env python
# coding:utf-8

class Vehicle:
    def __init__(self,name,speed,load,power):
        self.name = name
        self.speed = speed
        self.load = load
        self.power = power

    def run(self):
        print("开动啦。")

class Benz(Vehicle):
    def __init__(self,name,speed,load,power,color):
        # Vehicle.__init__(self,name,speed,load,power) # 使用指定类名方式调用了父类方法
        # super(__class__.self).__init__(name,speed,load,power) # 使用super(__class__.self)方式
        super().__init__(name,speed,load,power) # 采用super()不传参数的方法
        self.color=color

    def show_info(self):
        print(self.name,self.speed,self.load,self.power,self.color)

    def run(self):
        # Vehicle.run(self) # 使用指定类名称的方式,调用了父类方法
        super().run()
        print("%s %s 出发啦." % (self.color,self.name))

car1 = Benz("GLK 300","120","5人","2.4T","black")
car1.show_info()
car1.run()

继承的例子:

#!/usr/bin/env python
# coding:utf-8

‘‘‘
组合与继承都是有效地利用已有类的资源的重要方式。但是二者的概念和使用场景皆不同,

1.继承的方式

通过继承建立了派生类与基类之间的关系,它是一种‘是‘的关系,比如白马是马,人是动物。

当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如老师是人,学生是人

2.组合的方式

用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python和linux课程,教授有学生s1、s2、s3...

当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好
‘‘‘

class Dad:
    ‘这个是爸爸类‘
    money=10
    def __init__(self,name):
        print(‘父类‘)
        self.name=name
    def hit_son(self):
        print(‘%s 正在打儿子‘ %self.name)

# class Son(Dad):
#     pass
#
# # print(Son.money)
# # Son.hit_son()  # 继承了父类的数据属性和函数属性
# s1=Son(‘alex‘)
# s1.hit_son()
# print(s1.name)
# print(Dad.__dict__)
# print(Son.__dict__)

class Son(Dad):
    money = 1000000009
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def hit_son(self):
        print(‘来自子类‘)

s1 = Son(‘Jerry‘,12)
print(s1.money)
print(Dad.money) # 子类在自己里面定义了与父类同名的属性,并没有覆盖父类的属性
s1.hit_son()

print(s1.__dict__)

继承顺序:

#!/usr/bin/env python
# coding:utf-8

## 继承的顺序

class A:
    def test(self):
        print("A")

class B(A): # 单继承
    # def test(self):
    #     print("B")
    pass

class C(A):
    def test(self):
        print("C")
    pass

class D(B):
    # def test(self):
    #     print("D")
    pass

class E(C):
    # def test(self):
    #     print("E")
    pass

class F(D,E): # 多继承
    # def test(self):
    #     print("F")
    pass

f1 = F()
f1.test()
# 新式类查找顺序 F >> D >> B >> E >> C >> A
# 经典类查找顺序 F >> D >> B >> A >> E >> C

print(F.__mro__) # python2中经典类没有 __mro__

## 如果继承关系为菱形结构,那么属性的查找方式有两种,分别是:深度优先和广度优先
## 经典类时,要查找的属性不存在时,多继承会按照深度优先的方式查找
## 新式类时,要查找的属性不存在时,多继承会按照广度优先的方式查找,最后找到object

多态的例子:

#!/usr/bin/env python
# coding:utf-8

## 多态
## python本身就是多态的.
# 由不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同
# 指出了对象如何通过他们共同的属性和动作来操作及访问,而不需要考虑它们具体的类。
# 表明了动态绑定的存在,允许重载及运行时类型确定和验证。
# 体现在调用不同对象的共同方法时,才能展现出来。

class H2O:
    def __init__(self,name,temperature):
        self.name=name
        self.temperature=temperature
    def turn_ice(self):
        if self.temperature < 0:
            print(‘[%s]温度太低结冰了‘ %self.name)
        elif self.temperature > 0 and self.temperature < 100:
            print(‘[%s]液化成水‘ %self.name)
        elif self.temperature > 100:
            print(‘[%s]温度太高变成了水蒸气‘ %self.name)

class Water(H2O):
    pass
class Ice(H2O):
    pass
class Steam(H2O):
    pass

w1=Water(‘水‘,25)
i1=Ice(‘冰‘,-20)
s1=Steam(‘蒸汽‘,3000)

# 下面三个对象调用了相同的方法,但是得到的结果却不一样。
w1.turn_ice()
i1.turn_ice()
s1.turn_ice()

原文地址:https://www.cnblogs.com/FHBIAO/p/10174506.html

时间: 2024-10-24 09:44:49

python面向对象之继承/多态/封装的相关文章

面向对象之继承、封装与多态

继承 继承是面向对象中的一个重要概念,通过如果要创建的类与以有的类大部分属性.方法类似,那么可以通过继承的方式创建.一个类可以继承一个或多个类,继承一个类称为单继承,继承多个类称为多继承.被继承的类称为父类,也称为超类或基类,继承的类称为子类或派生类. 继承的实现 class Animal: def __init__(self, name, age, color): self.name = name self.age = age self.color = color def eat(self):

Python面向对象特性 - 继承

面向对象有3大特性:继承.多态.封装,本章介绍 Python中的 继承 特性~? 什么是继承 继承是创建类的一种方式,在 Python中支持多继承,即在创建类的时候可以继承一个或者多个父类.在继承关系中,被继承的类通常称为父类(或超类,基类),新建的类则称为子类(或派生类).?继承的优势在于可以有效地重用代码,提高代码的可读性~?继承示例: class Fu_1: # 父类 pass class Fu_2: # 父类 pass class Zi_1(Fu_1): # 单继承 pass class

Python 面向对象特性二 多态(3-7)

接口类: 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能 在Python中是没有接口的概念的(接口是在Java里的) from abc import ABCMeta,abstractmethod#调用abc模块中的抽象方法 # 接口类 : 接口类就是一个规范 接口类一般是项目设计人员写好的 class Pa

python面向对象之继承与派生

一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承,如果是多继承的话,继承顺序有深度和广度2种 示例: class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass pass

十七、Python面向对象之继承

在面向对象,继承是一个很重要的特性 子类与父类,子类是对父类的一种扩展,在父类的属性和方法上进行一些扩展 示例:没带继承 #定义一个带编号和状态的门的类 class Door(object): def __init__(self,num,status): self.num = num self.status = status def open(self): self.status = 'open' def close(self): self.status = 'close' #定义一个可以锁的门

Python全栈开发——面向对象的三大特性(继承 &amp; 多态 &amp;封装)

1.继承 1.两层意思改变和扩展(详细看随笔继承和组合) 2.多态(体现在运行时的状态) 1.不同的类可以调用相同的方法,得到不同的结果 2.实际上是继承的一种体现机制 class H2o: def __init__(self,name,temperature): self.name=name self.temperature=temperature def turn_ice(self): if self.temperature<0: print('温度太低,变成[%s]' %self.name

【Python学习之旅】---多态(类的相关知识,面向对象三大特性:继承-多态-封装)

class Name: __a='你是猪' #封装变量a def __init__(self,name): self.name=name def get_name(self): print('我叫%s' %self.name) n1=Name('陈宇霞')print(Name.__dict__) #查看类属性字典print(n1._Name__a) #可以通过此种方式调用__a ,没有真正的封装 #执行结果: {'__module__': '__main__', '_Name__a': '你是猪

【Python学习之旅】---封装与反射(类的相关知识,面向对象三大特性:继承-多态-封装)

#第一层封装:定义类#第二层封装:区分内外,有些属性只能内部使用,外部不能 class Name: __a='你是猪' #封装变量a def __init__(self,name): self.name=name def get_name(self): print('我叫%s' %self.name) n1=Name('陈宇霞')print(Name.__dict__) #查看类属性字典print(n1._Name__a) #可以通过此种方式调用__a ,没有真正的封装 #真正的封装:区分内外,

python类的继承、封装和多态

摘自https://www.cnblogs.com/evablogs/p/6724477.html 继承 1 2 3 4 5 6 7 8 class Person(object):     def __init__(self, name, gender):         self.name = name         self.gender = gender class Student(Person):    def __init__(self, name, gender,score):