Python3:面向对象(继承、多态和创建接口)

1.简介

当前学习来源:Head First Python书籍,通过定义类的方式创建自定义的对象,(Python支持多继承这点与Java不一样)

2.定义一个Python类

1.定义一个python类需要使用:class修饰符修饰

2.定义一个Father类

class Father:
    def __init__(self):
        print("father类被实例化!")

3.通过上面的例子:通过__init__(self)创建构造函数,并且构造函数中必须定义self,__init__就是一个构造函数

4.使用这个类创建对象

new_father = Father()

5.结果:
father类被实例化!

3.使用继承

class Father:
    def __init__(self):
        print("father类被实例化!")


class Son(Father):
    def __init__(self):
        print("son类被实例化!")


class Grandson(Son):
    def __init__(self):
        print("grandson类被实例化!")

1.使用继承的时候使用:class 类名(需要继承的类1[,需要继承的类2,需要继承的类3])

2.测试


new_son = Son()

new_father = Father()

new_grandson = Grandson()
son类被实例化!
father类被实例化!
grandson类被实例化!

3.发现python默认不会调用父类的构造函数进行实例化,实例化的时候跟父类无关(可能是多继承惹的祸)

4.在子类的构造函数调用父类的构造函数

1.在子类中调用父类的构造函数使用:父类.__init__(self,参数1[,参数2,参数3])

class Animal:
    def __init__(self, _type=None, _name=None):
        self.type = _type
        self.name = _name
        print("Animal 类被实例化")

    def to_string(self):
        print("Animal [ name:{0},type:{1} ]".format(self.name, self.type))


class Cat(Animal):
    def __init__(self, _type=None, _name=None):
        Animal.__init__(self,_type, _name)

2.测试

new_cat = Cat("貓科动物", "小花")
new_cat.to_string()

3.结果:

Animal 类被实例化
Animal [ name:小花,type:貓科动物 ]

4.通过调用父类的构造函数赋值,子类可以继承父类的函数,属性

5.子类重写父类的方法

class Animal:
    def __init__(self, _type=None, _name=None):
        self.type = _type
        self.name = _name
        print("Animal 类被实例化")

    def to_string(self):
        print("Animal [ name:{0},type:{1} ]".format(self.name, self.type))


class Cat(Animal):
    def __init__(self, _type=None, _name=None):
        Animal.__init__(self,_type, _name)
        # self.type = _type
        # self.name = _name

    # 重写方法后可以获取父类的变量,调用的时候为子类的toString方法
    def to_string(self):
        print("Cat [name:{0},type:{1}]".format(self.name, self.type))

1.测试

new_cat = Cat("貓科动物", "小花")
new_cat.to_string()

2.结果

Animal 类被实例化
Cat [name:小花,type:貓科动物]

6.使用Python中的多继承

使用多继承:class 类(需要继承的类1,需要继承的类2)

class Admin:
    def __init__(self):
        self.admin_role = "admin角色"


class Guest:
    def __init__(self):
        self.guest_role = "Guest角色"


class User(Admin, Guest):
    def __init__(self):
        self.roles = ["User角色"]
        Admin.__init__(self)
        Guest.__init__(self)
        self.roles.append(self.admin_role)
        self.roles.append(self.guest_role)

2.测试

new_user = User()
print(new_user.roles)

3结果:

['User角色', 'admin角色', 'Guest角色']

7.在当前python中创建接口并让子类实现

这里的知识是通过查看当前的queue的源码实现的
在这里插入图片描述
1.通过查看这个发现当前在类中可以定义泛型Generic[_T],使用泛型为_T

2.查看方法发现方法中定义为:def 函数名(self)->None:...方式,这个方法是应该就是说明当前的返回值为None(也可以是其他类型的数据例如:int),…表示省略方法体

所以实现如下:

class ICry:
    def cry(self) -> None: ...


class CatCry(ICry):
    def cry(self):
        print("喵喵的在叫!")


if __name__ == '__main__':
    cat = ICry()
    cat.cry()
    print("当前ICry接口的子类为:{0}".format(cat.__class__.__subclasses__()))
    cat = CatCry()
    cat.cry()
    print("当前cat实现类的基类为:{0}".format(cat.__class__.__bases__))

结果:
在这里插入图片描述
通过定义def cry(self) -> None: …方法提供没有的实现,让子类自己重写这个方法,但是相比于java来说约束性不是很强

8.总结

1.定义类的时候需要使用class 修饰,并定义构造函数__init__方法

2.python中可以使用多继承

3.通过def 函数(self) -> None: ...创建一个空实现的方法,让子类实现的方式创建伪接口,可以通过当前的对象.__class__.__subclasses__()获取当前对象类的子类,通过对象.__class__.__bases__获取当前对象类的基类

以上纯属个人见解,如有问题请联系本人!

发布了215 篇原创文章 · 获赞 39 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45492007/article/details/103106763
今日推荐