在不使用自身值的类中定义函数的正确方法

时间:2019-06-25 03:36:10

标签: python

我是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放在哪里,或者可能是如何重组该类。

谢谢您的考虑

3 个答案:

答案 0 :(得分:2)

您要寻找的是静态方法。要声明一个静态方法,可以这样做

OPTIONAL

答案 1 :(得分:2)

  1. 什么都没有。顺其自然,Python不会抱怨它,并且不使用实例的方法从根本上没有错。如果您的短毛猫抱怨它,您可以关闭该警告。这类辅助函数通常旨在用作私有方法,而不是供外部使用,您可能需要在名称前加上下划线以表明这一点。

  2. 将其转换为自由功能。 Python是一种OOP语言,但它也是一种混合范例语言,与Java不同,例如,您实际上可以在类声明之外创建函数。 Pythonic代码不一定意味着将所有内容都放入类中,并且自由函数通常是不涉及特定对象实例的函数的理想之选。

    def get_t(t):
        return t*t
    class example:
        def main(self):
            b=1
            k=self.get_t(b)
    
  3. 如果希望通过执行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)
    
  4. 如果仅从一个方法调用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

希望对您有帮助。