我是opp编程的新手。我想知道如何处理类内部但不使用自值的函数
例如
class example:
def __init__(self,n):
self.number=n
def get_t(self,t):
return t*t
def main(self):
b=1
k=self.get_t(b)
在示例中,函数get_t与自身值无关。
所以我想知道将函数get_t放在哪里,或者可能是如何重组该类。
谢谢您的考虑
答案 0 :(得分:2)
您要寻找的是静态方法。要声明一个静态方法,可以这样做
OPTIONAL
答案 1 :(得分:2)
什么都没有。顺其自然,Python不会抱怨它,并且不使用实例的方法从根本上没有错。如果您的短毛猫抱怨它,您可以关闭该警告。这类辅助函数通常旨在用作私有方法,而不是供外部使用,您可能需要在名称前加上下划线以表明这一点。
将其转换为自由功能。 Python是一种OOP语言,但它也是一种混合范例语言,与Java不同,例如,您实际上可以在类声明之外创建函数。 Pythonic代码不一定意味着将所有内容都放入类中,并且自由函数通常是不涉及特定对象实例的函数的理想之选。
def get_t(t):
return t*t
class example:
def main(self):
b=1
k=self.get_t(b)
如果希望通过执行Example.get_t(blah)
而不需要实例就可以从类中调用它,则可以使用staticmethod或classmethod装饰器。我建议使用classmethod,它可以完成staticmethod可以做的所有事情,而相反情况并非如此,当需要在多继承情况下重写classmethod时,更容易使classmethod正常工作。 staticmethod在性能方面的优势很小,但是如果您担心的话,您将进行微优化。
class example:
@classmethod
def get_t(cls, t):
return t*t
def main(self):
b=1
k=self.get_t(b)
如果仅从一个方法调用get_t(),则可以将其作为该方法的内部函数:
class example:
def main(self):
def get_t(t):
return t * t
b=1
k=self.get_t(b)
关于命名,get_xxx
通常是python中的代码味道。 get_
前缀表示该方法可能是getter,而pythonic代码通常不使用getter / setter,因为该语言支持属性。但是,您在这里所获得的实际上并不是一种吸气剂,而是一种计算方法,因此不应在其前加上get_
。更好的名字可能是calculate_t(t)或square(t)。
答案 2 :(得分:1)
案例1 :如果存在self
:-
class example:
def get_t(self,t):
return t*t
然后,您将无法像get_t
那样直接从类example
访问example.get_t(t=2)
函数,这会给您带来错误。但是您现在可以通过创建一个类似q = example()
的对象,然后创建q.get_t(t=2)
的对象来访问它,它将为您提供所需的结果。
案例2 :如果self
不存在:-
class example:
def get_t(t):
return t*t
现在,您可以像get_t
一样按类example
直接访问example.get_t(t=2)
函数,它将为您提供所需的结果。但是现在您无法通过创建get_t
之类的对象来使用q = example()
函数,然后q.get_t(t=2)
会给您带来错误。
结论:-这完全取决于您的用例。但是,当您遇到这种歧义时,请使用@staticmethod
,如下所示:-
class example:
@staticmethod
def get_t(t):
return t*t
希望对您有帮助。