教授给了我们以下代码:
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,所以它可能是相关的。
这看起来像是某种技巧性问题。你的教授要求你反驳这个装饰器所做的文档:
静态方法可以在类(如 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'
您可以通过检查适用的对象是否为__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