【问题标题】:Python static methods definitions placingPython静态方法定义放置
【发布时间】:2020-04-07 20:55:10
【问题描述】:

我正在寻找一个约定,说明应该如何安排 Python 类定义中不同类型的方法(即@staticmethod@classmethod)。 PEP-8 不提供有关此类主题的任何信息。

例如,Java 编程语言有一些code conventions 指的是静态变量和实例变量出现在类定义块中的顺序。声明此类建议的 Python 3 是否有任何标准?

【问题讨论】:

    标签: python-3.x conventions pep8


    【解决方案1】:

    我认为在 python 上声明 @staticmethod@classmethod 的方法是在函数的正上方添加该方法语句(@staticmethod@classmethod)。
    @classmethod 的用法就像实例函数,它需要一些像classcls这样的参数(你可以改变参数名称,所以它取决于你)。
    无论是@static method,它不需要像实例这样的self或类参数方法或类方法。这两个方法绑定到类而不是类的对象,因此@staticmethod 无法访问或修改它,因为@staticmethod 不知道类的状态,但@classmethod 可以访问或修改类状态,因为它可以访问它(在调用 @classmethod 时查看 cls 参数)但请记住,如果您通过 @classmethod 更改某些状态,它将更改类的所有实例的所有状态。
    您可以在下面的示例中看到差异。

    例子:

    @classmethod
    def something(cls, arg1, arg2, ....): #this is class method
    
    @staticmethod
    def something2(arg1, arg2, ...):   #this is static method
    

    更多解释,也许你可以看到这个链接:
    静态和类方法说明:link
    类或静态变量说明:link

    *我编辑了我的答案,因为我似乎没有回答你的问题
    没有任何严格的规则/标准来安排它,幸运的是,在 python 中,你不必指定你想要定义的方法类型(在 java 中,如 public void ...或 private int ...等)。

    1. 类名称

    首先是类的名称,然后你可以像java一样拥有属性引用和实例化。你也可以指定属性的范围(如私有等)。

    1. 实例化

    然后你可以像java一样通过声明def __init__(self, ...)来声明实例化。如果你声明实例化,那么当你声明新的类实例时它会自动调用__init__。如果你不声明这个,python 会继续调用这个函数,因为它自动从基类继承,不会做任何事情

    1. 功能/方法

    之后,你可以声明函数。你可以定义instance method@classmethod@staticmethod 并做一些事情。它的方法有它自己的优点,所以这取决于你如何需要它。

    Python 也支持继承和多重继承。 如需进一步说明,您可以查看此链接link

    希望对你有帮助。

    【讨论】:

    • 问题不在于装饰器去哪里使方法成为类或静态方法。问题是关于如何在类语句中对不同的方法类型进行排序。
    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多