[面向对象]:方法 (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 ---
本文来自博客园,作者:渝北小站,转载请注明原文链接:https://www.cnblogs.com/timgunt/p/15717125.html

浙公网安备 33010602011771号