面向对象的补充

 

面向对象的两个概念(类和对象)

类是一类事物的抽象表示形式

对象是某类事物的一个具体实例

 

那么究竟先有类还是现有实例对象?
从设计角度来讲:必须是先有实例对象(或者是一种脑海中的概念),后有类。

从不同的实例对象抽象出类的定义。

比如:现在需要使用到一种称为FlyPig的对象,它既能像pig一样的吃,也能像bird一样的飞

如果现实世界中有这样的东西,那么就从它们身上抽取共同点,形成类。

如果现实世界中没有这样的东西,那么就在脑海中想象它们应该有什么特点,从而抽象出类。

从使用的角度来讲:先有类,才能实例化对象。

类就是一种创建不同实例对象的模板 

关于抽象类的补充

from abc import ABCMeta, abstractmethod


class A(metaclass=ABCMeta):
    def __init__(self):
        self.name = 'abc'

    # 通常抽象方法中都不会定义方法体,如果有方法体的话,可以封装成类方法,用类名调用,因为抽象类不能实例化,只能通过类名调用
    @classmethod
    @abstractmethod
    def func(cls):
        print('A.func()')

A.func()

以上是抽象类中的抽象方法如何被调用,由于不能实例化对象,只能是通过装饰成类方法类通过类名调用

注意:两个装饰器的顺序,@classmethod必须在上边!!!

动态添加实例属性和实例方法

class A():
    pass


a = A()
# 动态添加实例变量
a.name = 'Andy'
print(a.__dict__)


# 定义函数,至少提供一个绑定对象的参数
def func(self):
    print(self.name)


a.func = func
print(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添加类属性a
print(A.__dict__)

 

各种方法的使用总结:

  类名调用 对象名调用
实例方法 可以
但需要手动绑定第一个参数
可以
类方法(classmethod) 可以 可以
静态方法(staticmethod) 可以 可以
类变量 可以 可以

 

posted @ 2019-04-09 18:13  blog_wu  阅读(128)  评论(0编辑  收藏  举报