Python之面向对象:继承——第十四天

1、面向对象的优点:
面向对象是一种结构化的编程方式,好处如下:
(1)通过封装明确了内、外
(2)通过继承+多态在语言层面支持了归一化设计
归一化设计原理:使用接口函数、一切皆文件

2、类的定义
类是一种数据结构,就好比一个模型,该模型用来表述一类事物(事物即数据和动作的结合体),用它来产生真实的物体(实例)

3、对象的定义
你看到的一切事物都是一个个的对象,可以把对象理解成为一个具体的事物(拥有数据和动作的结合体)

4、类和对象的关系
对象都是由类产生的,上帝造人,首先有一个造人的模板,这个模板即人的类,然后上帝根据类的定义来生产一个个的人

5、实例化定义
由类生产对象的过程叫实例化,类实例化的结果就是一个对象,或者叫做一个实例(实例=对象)

6、面向对象设计:将一类具体事物的数据和动作整合到一起

7、面向对象编程:用了定义类+实例对象的方式去实现面向对象的设计

8、静态方法
staticmethod静态方法只是名义上的归属类,不能使用类变量和实例变量,是类的工具包

class Room:
    def __init__(self,name,owner,width,length):
        self.name=name
        self.owner=owner
        self.width=width
        self.length=length

    @property
    def cal_area(self):
        area=self.width * self.length
        return area

    @staticmethod
    def wash_room():
        print("这里是洗浴室")


R1=Room("别墅","lalala",100,100)
print(R1)

#输出结果:
<__main__.Room object at 0x1038f51c0>

9、组合
(1)定义:定义一个类,通过数据属性形成一个实例化的对象,这就是组合
(2)用途:

  • 各个做关联
  • 小的组成大的

10、面向对象三大特性:继承、封装、多态
(1)继承

  • 继承分为单继承和多继承
  • 子类继承了父类的所有属性,如果重名,子类先执行自己内部定义
class ParentClass1:
    pass

class ParentClass2:
    pass
    
#单继承
class SonClass1(ParentClass1):               
    pass

#多继承
class SonClass2(ParentClass1,ParentClass2):      
    pass

(2)继承和集合的选择?

  • 当类之间有显著不同,较小的类是较大的类的组件的时候,用集合比较好
  • 当类之间有很多相同的功能,提取这些共同的功能做成基类的时候,用继承比较好,如下实例
class animal:
    def eat(self):
        pass
    def drink(self):
        pass
    def la(self):
        pass
    def sa(self):
        pass
    
class dog(animal):
    def wang(self):
        print("汪汪汪")

class cat(animal):
    def miao(self):
        print("喵喵喵")

(3)继承的含义

  • 继承父类的方法,并且做出自己的改变或者扩展(代码重用)
    但是这种方法不太好,一般写代码规范耦合度越小越好,这样是强耦合
  • 声明于某个子类兼容于某父类,定义一个接口类,子类继承接口类,并且实现接口中定义的方法
class animal:
    def eat(self):
        pass
    def drink(self):
        pass
        
class dog(animal):
    def eat(self):
        print("c吃")
    
    def drink(self):
        print("喝")
    
    def wang(self):
        pass

说明:

  • 接口继承实质上是要求作出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现特定接口的所有对象——这在程序设计上,叫做”归一化“
  • 接口类的存在是为了规范子类
  • 接口继承不同于普通继承,接口继承中子类必须继承父类的方法,父类方法仅定义即可,具体行为可以在子类中实现,如上。
  • 接口继承需要导入一个abc模块,父类加上对子类的限制,并且在父类方法加装饰器,如下
import abc
class animal(metaclass=ABCMeta):

    @abc.abstractmethod
    def eat(self):
        pass

class dog(animal):
    @abc.abstractmethod
    def eat(self):
        print("c吃")

    def wang(self):
        pass

(4)继承顺序

  • Python的类可以继承多个类,Java和C#中只能继承一个类
  • Python的类如果继承了多个类,继承的顺序有两种:深度优先和广度优先,在python3中都是按照广度优先的方式
  • 深度优先:按照一侧找到底,再从另一侧开始找
  • 广度预先:按照一侧开始找,找到不包含父类的前一类,再从另一侧开始找
    当类是经典类的时候,多继承的情况下,会按照深度优先的方式查找
    当类是新式类的时候,多继承的情况下,会按照广度优先的方式查找

区分经典类和新式类:
新式类包含很多功能,从写法上父类继承了object类测试新式类,否则是经典类

经典类:

class A:
    pass
class B(A):
    pass

新式类:

class A(object):
    pass
class B(A):
    pass

(5)子类调用父类方法,可以直接引用父类的__ init__()函数

class Vehicle:
    Country="China"
    def __init__(self,name,speed,load,power):
        self.name=name
        self.speed=speed
        self.load=load
        self.power=power
    def run(self):
        print("开动啦")

class Subway(Vehicle):


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

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

S1=Subway("地铁","543m/s","10000000","电","13号线")

S1.show_info()

输出结果:
地铁 543m/s 1000000013号线

也可以直接用supper()调用,就把Vehicle.__init__变成supper.init

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值