1
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,因为它每次都会创建一个对象。

4

1 回答 1

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'

不用担心描述符或部分对象的开销;这与您正常调用实例或类方法时发生的情况没有什么不同。

于 2013-02-01T09:48:41.873 回答