高级编程继承,多态

#继承是什么

继承就是得到对应的特征,继承类型包括父类和子类

理解:父类可以传基因,子类去继承他的基因

#继承有单继承和多继承

单继承:

         一个子类继承一个父类

        注意:隐藏属性不可以继承

#创建一个父类
class Qun:
    def __init__(self):
        self.money=100000
        self.__height=180

#创建子类
class Qun1(Qun):#这里的子类Qun1继承了Qun的属性
    pass
qun1=Qun1()
print(qun1.money)

如果子类要修改,或者添加父类的属性需要super 拿到权限

注意: 私有属性不可以继承

#创建一个父类
class Qun:
    def __init__(self):
        self.money=100000
        self.__height=180

#创建子类
class Qun1(Qun):#这里的子类Qun1继承了Qun的属性
    def __init__(self):
        super(Qun1, self).__init__()
        self.house="北京"
        self.money=100
qun1=Qun1()
print(qun1.money)
print(qun1.house)

#多继承,意思就是可以继承多个父类

格式:( 父类  1, 父类2  )

补充:__mro__可以查询继承顺序

#创建一个父类
class A:
    def __init__(self):
        self.age=18
    def fun(self):
        print(f"A今年{self.age}岁了")
class B:
    def __init__(self):
        self.name="B"
    def fun1(self):
        print(f"我的名字是{self.name}")
#C继承A,B
class C(A,B):
    def __init__(self):
        super(C, self).__init__()
        self.name="B"
        self.age=18

#实例化
c=C()
#调用继承的方法
c.fun()
c.fun1()
#可以查看继承顺序
print(C.__mro__)

#多态

一个对象的多种形态,调用同一个方法表现出不同形式

遵守两个原则:1.必须要有类的继承   2.子类需要重写父类的方法

class Money:
    def ticke(self):
        print("车票单价")
class Bus(Money):
    def ticke(self):
        print("票价为150元")
class Car(Money):
    def ticke(self):
        print("票价为200元")

bus=Bus()
car=Car()
#继承之后,一个方法有不同形式
bus.ticke()
car.ticke()

#绑定

绑定(类方法)

类方法:通过装饰器@classmethod进行装饰,绑定类cls

class Student:
    #这个就是类的属性
    num=0
    def __init__(self,name):
        self.name=name
    def sleep(self):
        print(f"{self.name}在睡觉")
    @classmethod
    #类的装饰器
    #cls是类的本身
    def count(cls):
        cls.num+=1
        return cls.num
#实例化之后调用count,sleep的方法
stu1=Student("小鱼")
print(stu1.count())
stu1.sleep()

stu2=Student("小虎")
print(stu2.count())
stu2.sleep()

#静态属性,不用cls本身来操作

用@staticmetho操作

class Student:
    #这个就是类的属性
    num=0
    def __init__(self,name):
        self.name=name
    def sleep(self):
        print(f"{self.name}在睡觉")
    @staticmethod
    #类的装饰器
    #cls是类的本身
    def count():
        print("用不了cls本身,无法计算个数")
#实例化之后调用count,sleep的方法
stu1=Student("小鱼")
stu1.count()
stu1.sleep()

#内置方法

1.信息格式化方法

__str__   该方法就是用来返回文本信息的,说明类的内容

class A:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        return f"我可以直接返回{self.name}是{self.age}"
a=A("小鱼",16)
#这里打印类就会直接输出文本信息{我可以直接返回小鱼是16}
print(a)

2.析构方法(魔法方法)

__del__  当检测对象被引用时会自动删除占用内存

简单的来说:就是亡语,最后输出

class A:
    def __init__(self,name):
        self.name=name
    def fun(self):
        print(f"{self.name}还活着")
    def __del__(self):
        print(f"{self.name}没了")
a=A("小鱼")
#这里的内容就算先被调用也是最后输出
a.__del__()
a.fun()

__new__ 是内置的静态方法,返回一个对象的引用

new必须有返回值

那么与init有什么不同呢

相同点:都可以初识化

不同点:new可以控制初识化的多少,但是init不可以

class A:
    #先设置一个空的类私有属性
    __age=None
    def __new__(cls, *args, **kwargs):
        #这里控制空间大小
        if cls.__age==None:
            #super().__new__(cls)代表占用的内存
            cls.__age=super().__new__(cls)
            return cls.__age
    def __init__(self,naem):
        self.name=naem
a=A("小鱼")
print(a.name)
#第二个实例化就会报错,因为被限制1个内存了
b=A("小艾")
print(b.name)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值