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__获取当前对象类的基类
以上纯属个人见解,如有问题请联系本人!