python:这是一个为classmethod和方法使用相同函数名的好方法吗?

时间:2013-02-01 09:22:09

标签: python static-methods class-method

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

1 个答案:

答案 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'

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