class A(object):
@classmethod
def print(cls):
print 'A'
def __print(self):
print 'B'
def __init__(self):
self.print = self.__print
a = A()
a.print()
A.print()
我认为这太难看了,有没有其他方法可以实现相同的功能?不要说combinemethod,因为它每次都会创建一个对象。
答案 0 :(得分:4)
最简单的解决方案是创建一个描述符装饰器,如classmethod
,但也将实例传递给方法:
from functools import partial
class descriptormethod(object):
def __init__(self, fn):
self.fn = fn
def __get__(self, instance, owner):
return partial(self.fn, instance, owner)
class A(object):
@descriptormethod
def print_(self, cls):
print 'A' if self is None else 'B'
不要担心描述符或部分对象的开销;它与正常调用实例或类方法时发生的情况没有什么不同。