Python Make方法可以从类或实例调用

Python Make方法可以从类或实例调用,python,python-3.x,methods,Python,Python 3.x,Methods,我想创建一个从类或实例调用的方法。 例如: class-SomeClass: a=10 定义初始值(self,val): self.a=val def打印(自身): 打印(self.a) SomeClass(20)。打印a()#20 SomeClass.print_a()#错误! 在这里我想让print\u一个也可以被类调用。 如果我使用classmethod,结果是错误的 class-SomeClass: a=10 定义初始值(self,val): self.a=val @类方法 def打印

我想创建一个从类或实例调用的方法。
例如:

class-SomeClass:
a=10
定义初始值(self,val):
self.a=val
def打印(自身):
打印(self.a)
SomeClass(20)。打印a()#20
SomeClass.print_a()#错误!
在这里我想让
print\u一个
也可以被类调用。
如果我使用
classmethod
,结果是错误的

class-SomeClass:
a=10
定义初始值(self,val):
self.a=val
@类方法
def打印(cls):
印刷品(cls.a)
SomeClass(20)。打印a()#10(错!)
SomeClass.print_a()#10
我希望结果是这样的:

SomeClass(20)。打印a()#20
SomeClass.print_a()#10

如何实现这一点?

classmethod
只是一个描述符对象,您可以在中了解如何使用纯python实现它。以该实施为灵感:

from types import MethodType
class HybridMethod:
    def __init__(self, f):
        self.f = f

    def __get__(self, obj, cls=None):
        if obj is None:
            return MethodType(self.f, cls)
        else:
            return MethodType(self.f, obj)

class SomeClass:
    a = 10

    def __init__(self, val):
        self.a = val

    @HybridMethod
    def print_a(self):
        print(self.a)

SomeClass(20).print_a()    
SomeClass.print_a()    

classmethod
只是一个描述符对象,您可以在中了解如何使用纯python实现它。以该实施为灵感:

from types import MethodType
class HybridMethod:
    def __init__(self, f):
        self.f = f

    def __get__(self, obj, cls=None):
        if obj is None:
            return MethodType(self.f, cls)
        else:
            return MethodType(self.f, obj)

class SomeClass:
    a = 10

    def __init__(self, val):
        self.a = val

    @HybridMethod
    def print_a(self):
        print(self.a)

SomeClass(20).print_a()    
SomeClass.print_a()    

非常感谢!“我想我需要一些时间来弄清楚这段代码是如何工作的。”春夜路从一开始就读了这段代码。另外,更多的细节在非常感谢!“我想我需要一些时间来弄清楚这段代码是如何工作的。”春夜路从一开始就读了这段代码。此外,更多详细信息请参见