【问题标题】:Make method can be called from class or instance可以从类或实例调用 Make 方法
【发布时间】:2020-11-10 07:26:18
【问题描述】:

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

class SomeClass:
    a = 10

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

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

SomeClass(20).print_a()    # 20
SomeClass.print_a()    # Error!

这里我想让print_a也可以被类调用。
如果我使用classmethod,结果是错误的。

class SomeClass:
    a = 10

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

    @classmethod
    def print_a(cls):
        print(cls.a)
        
SomeClass(20).print_a()    # 10  (wrong!)
SomeClass.print_a()    # 10

我希望结果是这样的:

SomeClass(20).print_a()    # 20
SomeClass.print_a()    # 10

我怎样才能做到这一点?

【问题讨论】:

    标签: python python-3.x methods


    【解决方案1】:

    classmethod 只是一个描述符对象,您可以在Descriptor HOWTO 中了解如何使用纯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()    
    

    【讨论】:

    • 非常感谢!我想我需要一些时间来弄清楚这段代码是如何工作的。
    • @Chun-YeLu 从头开始​​阅读HOWTO。此外,data model documentation 中的更多详细信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2016-08-30
    • 1970-01-01
    • 2015-06-10
    相关资源
    最近更新 更多