3.面向对象
3.1 三大特性
面向对象三大特性:继承 封装 多态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| class Base(object): def __init__(self): self.leg = "4"
def func1(self): print(f"Base 有 {self.leg} 条腿...")
class Cat(Base): def func1(self): print(f"我是cat,有{self.leg}条腿...") print("我会上树")
class Dog(Base): def func1(self): print(f"我是dog,有{self.leg}条腿...") print("我跑得快")
class Table(Base): def func1(self): print(f"我是一个餐桌,也有{self.leg}条腿,但我不会跑...")
def func(arg): arg.func1()
func(Base()) func(Dog()) func(Cat()) func(Table())
|
3.2 类方法和静态方法
classmethod 给类定义的方法
staticmethod 目的只是封装在一起,内聚
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Person(object):
def __init__(self, name): self.name = name
@classmethod def name(cls, name): return cls(name)
@staticmethod def age(age: int): return age
def __repr__(self): return self.name
a = Person(name="张三") print(a) b = Person.name("李四") print(b) print(a.age(18)) print(Person.age(20))
|
3.3 property装饰器
1.将函数属性伪装成数据属性
2.统一数据属性的查、改、删操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Person: def __init__(self, name): self.__name = name
@property def name(self): return self.__name
@name.setter def name(self, value): self.__name = value
@name.deleter def name(self): print('deleter')
obj1 = Person('abc') print(obj1.name) obj1.name = 'aaa' print(obj1.name) del obj1.name
|
3.4 cached_property
相比 property
增加缓存功能,针对不可变的高计算资源消耗的实例特征属性
1 2
| from functools import cached_property pip3 install cached-property
|
3.5 属性查找顺序
对象 —> 父类 —> 继承类, 依次类推,找不到则报错
3.6 多继承
- 多继承的优点:同时继承多个父类属性和方法,功能强大。
- 多继承缺点:代码可读性变差。
- 通过类的mro()方法查看多继承的查找顺序。
__bases__
可以查看类继承的所有父类
1 2 3
| print(C.mro())
print(C.__bases__)
|
3.7 广度优先和深度优先
1 2 3 4 5 6 7
|
- object类提供了一些常用内置方法的实现,如用来在打印对象时返回字符串的内置方法__str__
新式类:广度优先 obj -> <class '__main__.C'> -> <class '__main__.A1'> ... -> <class 'object'>
|
3.8 抽象基类
1.抽象类本身不能实例化
2.子类必须实现其定义接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import abc
class Animal(metaclass=abc.ABCMeta): @abc.abstractmethod def talk(self): pass
class Cat(Animal): def talk(self): pass
cat = Cat()
|
3.9 isinstance 和 issubclass
1 2
| print(isinstance(a, int)) print(issubclass(People, Animal))
|
3.10 动态获取对象信息(反射)
1 2 3 4
| hasattr(obj, 'x') getattr(object, name, default=None) setattr(x, 'y', 'v') delattr(x, 'y')
|