[面向对象]:方法 (methods)

进一步讨论 python 面向对象编程 中的 方法。

> 绑定方法(bound methods),类方法(unbound methods),静态方法(static methods)

在其它一些编程语言中,类的方法通常划分为3种:绑定方法,类方法,静态方法。

其中绑定方法只能由基于这个类实例化得到的对象进行调用,而类方法和静态方法只能由这个类本身进行调用。后两者的区别在于,类方法需要向方法传递参数,而静态方法不需要。

在python中,要实现这部分功能也是可以的,如下代码:

class Foo(object):
    CLASS_MSG = "这是一个类,名叫 Foo"  # 在这里定义类(class)变量

    def __init__(self, msg):
        self.msg = msg  # 在这里定义实例(obj)变量

    def f1(self):
        print("这是绑定方法,它通常调用了obj中存储的数据,比如对于当前obj, 数据= 【{}】".format(self.msg))

    @classmethod  # 添加一个类方法的装饰器
    def f2(cls):
        print("这是类方法,它通常使用class中存储的数据,比如对于当前class, 数据= 【{}】".format(cls.CLASS_MSG))

    @staticmethod  # 添加一个静态方法的装饰器
    def f3():
        print("这是静态方法,它不需要任何数据,只干活!")


# 基于Foo类,实例化对象obj1,obj2
obj1 = Foo("are you ok?")
obj2 = Foo("我是雷军,你们好吗?")

# 原则上obj只能使用绑定方法,所谓的绑定,其实说的就是和具体的实例化对象obj进行分别绑定
obj1.f1()
obj2.f1()
print()
# 原则上Foo只能使用类方法,和静态方法
Foo.f2()
Foo.f3()


# [运行结果如下]:########################
"""
这是绑定方法,它通常调用了obj中存储的数据,比如对于当前obj, 数据= 【are you ok?】
这是绑定方法,它通常调用了obj中存储的数据,比如对于当前obj, 数据= 【我是雷军,你们好吗?】

这是类方法,它通常使用class中存储的数据,比如对于当前class, 数据= 【这是一个类,名叫 Foo】
这是静态方法,它不需要任何数据,只干活!
"""
# #######################################

然而,python3 中实质上已经摒弃了对 绑定方法 和 类方法 的区分,基于上述例子,进一步运行如下代码:

# f1绑定到内存中的某个具体的obj
print(obj1.f1)
print()
# f2绑定到class
print(obj1.f2)	# 如果非要基于某个obj去调用f2,效果和基于class去调用f2相同
print(Foo.f2)
print()
# f3就是一个function
print(obj1.f3)	# 如果非要基于某个obj去调用f3,效果和基于class去调用f3相同
print(Foo.f3)


# [运行结果如下]:########################
"""
<bound method Foo.f1 of <__main__.Foo object at 0x000000000137A640>>

<bound method Foo.f2 of <class '__main__.Foo'>>
<bound method Foo.f2 of <class '__main__.Foo'>>

<function Foo.f3 at 0x0000000003C4E550>
<function Foo.f3 at 0x0000000003C4E550>
"""
# #######################################

> 向 已定义好的类 增加 方法 (monkey patching)

# 定义一个 Foo 类
class Foo(object):

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self):
        print("{} 吃了点东西".format(self.name))


obj = Foo("tim", "8")
obj.eat()


# 定义一个 show 函数
def show(self):
    print("{}-{}".format(self.name, self.age))


# show函数 作为新的方法 加入到 Foo
Foo.show = show

# 调用 Foo 中的 show
obj.show()

# [运行结果如下]:########################
"""
tim 吃了点东西
tim-8
"""
# #######################################

--- to be continue ---

posted @ 2021-12-21 21:01  渝北小站  阅读(250)  评论(0)    收藏  举报