面向对象的两个概念(类和对象)
类是一类事物的抽象表示形式
对象是某类事物的一个具体实例
那么究竟先有类还是现有实例对象?
从设计角度来讲:必须是先有实例对象(或者是一种脑海中的概念),后有类。从不同的实例对象抽象出类的定义。
比如:现在需要使用到一种称为FlyPig的对象,它既能像pig一样的吃,也能像bird一样的飞
如果现实世界中有这样的东西,那么就从它们身上抽取共同点,形成类。
如果现实世界中没有这样的东西,那么就在脑海中想象它们应该有什么特点,从而抽象出类。
从使用的角度来讲:先有类,才能实例化对象。
类就是一种创建不同实例对象的模板
关于抽象类的补充
from abc import ABCMeta, abstractmethodclass A(metaclass=ABCMeta): def __init__(self): self.name = 'abc' # 通常抽象方法中都不会定义方法体,如果有方法体的话,可以封装成类方法,用类名调用,因为抽象类不能实例化,只能通过类名调用 @classmethod @abstractmethod def func(cls): print('A.func()')A.func()
以上是抽象类中的抽象方法如何被调用,由于不能实例化对象,只能是通过装饰成类方法类通过类名调用
注意:两个装饰器的顺序,@classmethod必须在上边!!!
动态添加实例属性和实例方法
class A(): passa = A()# 动态添加实例变量a.name = 'Andy'print(a.__dict__)# 定义函数,至少提供一个绑定对象的参数def func(self): print(self.name)a.func = funcprint(a.__dict__)# 调用新添加的实例方法,需要手动绑定第一个参数为当前对象a.func(a)
第二种添加实例方法的方式:
# 第二种添加实例方法的方式,使用types模块中的MethodType类from types import MethodType# 定义函数,至少提供一个用于绑定对象的参数def func2(self): print('func2')a.func2 = MethodType(func2, a)a.func2()
类的动态性:
python是一门动态语言,意味着在程序运行期间,可以动态的对类的定义进行修改。
class A(): # 定义类时指定类的属性name name = 'A' def show(self): print('show')A.a = 10 # 给类A添加类属性aprint(A.__dict__)
各种方法的使用总结:
类名调用 | 对象名调用 | |
实例方法 | 可以但需要手动绑定第一个参数 | 可以 |
类方法(classmethod) | 可以 | 可以 |
静态方法(staticmethod) | 可以 | 可以 |
类变量 | 可以 | 可以 |