python基础篇--day12

23 篇文章 0 订阅
21 篇文章 1 订阅

继承

所有的类都继承了Object类,
目的: 简化代码,提高代码的可读性

单继承

继承会继承父类的所有公有函数和变量

class father:
    money = 1000  # 父类的类属性
    __gril = "女"  # 父类的私有变量

    def __init__(self):
        self.gender = "男"

    def smoke(self):
        print("吸烟有害健康,所以老子吸烟")


class son(father):
    pass


s = son()
print(s.money)  # 能把父类公有的钱继承过来
s.smoke()  # 父类方法也会继承
print(s.__gri)  # 私有不继承,AttributeError: 'son' object has no attribute '__gri'

私有变量不被继承

class Father:
    def __init__(self):
        self.__a = 10
        self.b = 8

    def show(self):
        r = self.__a + self.b # 用的是父类里面的__a
        print('运算结果是:', r)


class Son(Father):
    def __init__(self):
        Father.__init__(self)
        self.__a = 100


s = Son()
s.show() # 输出18

多层继承

经典类:
旧式类的MRO算法是采用深度优先搜索
经典类构造函数重复执行多次。

新式类 :
新式类都会继承object
新式类相同父类只执行一次构造函数
新式类的MRO(method resolution order 基类搜索顺序)算法采用C3算法广度优先搜索
print(F.mro) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性 F代表最低的子类

class father:
    def fun(self):
        print("祖宗")


class A(father):
    def fun(self):
        print("A")

class B(father):
    def fun(self):
        print("B")

class A1(A):
    def fun(self):
        print("A1")
class A2(A):
    def fun(self):
        print("A2")

class B1(B):
    def fun(self):
        print("B1")
class B2(B):
    def fun(self):
        print("B2")

class C(A2,B1):
    def fun(self):
        print("C")


print(C.__mro__)

在这里插入图片描述

重写

父类的方法不能满足于子类的需求,在子类中定义一个与父类相同名的函数(参数也要一致)

  • 子类调用父类的方法:
    1. 父类.方法名(self)
    2. super(子类名,self).方法名()

类装饰器

元类

当你用解释器去创建一个类的时候,这个类会调用元类去创建它。

type():用来构建一切类型的一个类
type(对象) ---->返回当前对象的类型
type(name,bases,attrs) --> name:类名 bases:保存所有父类 attrs 字典 类里面的数据和方法

自定义元类:

 class xxx(type):
    def __new__(cls,name,bases,attrs):
        do something
        ....
        return type.__new__(cls,name,bases,attrs)
        
 class Student(父类,metaclass=xxx):
     pass
class ListMetaclass(type):
    def __new__(cls, name, bases, attrs):
        print(name)
        print(bases)
        print(attrs)
        attrs['b'] = 'world'
        if attrs.get('test'):
            attrs.pop('test')
        return type.__new__(cls, name, bases, attrs)


class MyList(object, metaclass=ListMetaclass):
    a = 'hello'

    def test(self):
        print('---->test')


l = MyList()
print(l)
print(l.a)
# print(l.b)
l.test()

单例类

单例是一种设计模式,在某种应用模式下只能实例化一个对象,而不会产生多个对象。

# 普通方式
class Person:
    __instance = None

    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            cls.__instance = object.__new__(cls, *args, **kwargs)
        return cls.__instance

    def __init__(self):
        print('---->init')


p1 = Person()
p2 = Person()
p3 = Person()

print(id(p1))
print(id(p2))
print(id(p3)) # 三个的地址都一样
# 装饰器实现单例
class cls_decorator:
    def __init__(self, f):
        self.f = f
        self.__instance = {}

    def __call__(self, *args, **kwargs):
        if self.f not in self.__instance:
            self.__instance[self.f] = self.f()   # self.f = Singleton   Singleton()
        return self.__instance[self.f]  # {'Singleton':<Singleton object at 0x00000000022205F8>}


@cls_decorator  # 1.cls = cls_decorator()  2. Singleton = cls
class Singleton:
    def __init__(self):
        print('---->Singleton init')


print(Singleton)
s1 = Singleton()  # cls()
s2 = Singleton()

print(s1 is s2) # True
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只敲代码的大脸猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值