强制静态和类方法只能通过实例调用,不能通过类调用

问题描述 投票:0回答:2

教授给了我们以下代码:

class Dolar:

    @staticmethod
    def dolar():
        return 4680
    
    def __init__(self,pesos):
        self.pesos = pesos

    def convertir(self):
        return self.pesos * Dolar.dolar()
    
if __name__ == '__main__':

    print(Dolar.dolar())
    valor_actual = Dolar(5000)
    print(valor_actual.dolar())
    print(f'{valor_actual.convertir():,}')

通过实例和类打印方法“dolar”的值。现在他希望我们阻止通过类调用所述方法,以便它只能通过实例完成。

我们最近学习了python中的@property,所以它可能是相关的。

python class properties static-methods class-method
2个回答
0
投票

这看起来像是某种技巧性问题。你的教授要求你反驳这个装饰器所做的文档

静态方法可以在类(如 C.f())或实例(如 C().f())上调用。此外,它们可以作为常规函数调用(例如 f())。

不清楚到底需要什么。但是,解决此要求的一种方法是将该方法定义为类构造函数的一部分。这样函数不存在于类本身,因此不能被调用。

def bar():
    return 1

class Foo:
    def __init__(self):
        self.bar = staticmethod(bar)
>>> Foo().bar()
1
>>> Foo.bar()
Traceback (most recent call last):
  File ...
    Foo.bar()
    ^^^^^^^
AttributeError: type object 'Foo' has no attribute 'bar'

0
投票

您可以通过检查适用的对象是否为__get__来覆盖

None
方法来实现自己的
static方法描述符
,在这种情况下,该方法是通过类调用的:

class StaticMethod:
    def __init__(self, f):
        self.f = f

    def __get__(self, obj, objtype=None):
        if not obj:
            raise NotImplementedError('Must be called via an instance.')
        return self.f

    def __call__(self, *args, **kwargs):
        return self.f(*args, **kwargs)

class Dolar:
    @StaticMethod
    def dolar():
        return 4680

演示:https://replit.com/@blhsing/VengefulThoughtfulSyndrome

© www.soinside.com 2019 - 2024. All rights reserved.