python 为啥要使用静态方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 为啥要使用静态方法相关的知识,希望对你有一定的参考价值。

Python使用静态方法类似函数工具使用,一般尽量少用静态方法。
Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的:
1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;
2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例变量,但可以访问类变量;
3)静态方法有点像函数工具库的作用,而类成员方法则更接近类似Java面向对象概念中的静态方法。
参考技术A

你好,Python的静态方法和类成员方法的区别:

Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的:
1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;
2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例变量,但可以访问类变量;
3)静态方法有点像函数工具库的作用,而类成员方法则更接近类似Java面向对象概念中的静态方法。

本回答被提问者和网友采纳
参考技术B 虽然Python类属性总是可以通过obj.__class__.attr的形式访问,但采用静态方法可以简化和加速类属性的操作。 参考技术C 因为在不需要传入属性值进行处理的情况下,静态方法更容易让人清楚的阅读。
但是静态方法依然是可以传入参数的,只是这个参数不是在类中被定义的属性。
参考技术D 因为有的方法应该是属于类公用的,而不是属于类的某个实例的

为啥要使用 __prepare__ 方法来获取类的命名空间?

【中文标题】为啥要使用 __prepare__ 方法来获取类的命名空间?【英文标题】:Why should I use the __prepare__ method to get a class' namespace?为什么要使用 __prepare__ 方法来获取类的命名空间? 【发布时间】:2017-10-04 21:59:34 【问题描述】:

注意 这个问题与 Python 3 Enum 数据类型无关,这只是我正在使用的示例。

使用PEP 3115,Python 3 将__prepare__1 方法添加到type,以便在创建类时允许使用自定义命名空间。例如,新的Enum 数据类型使用__prepare__ 返回私有_EnumDict 的实例,用作新的Enum 类的命名空间。

但是,我已经看到几个关于 SO2EnumMeta 被子类化的示例,在元类 __new__ 方法中为该类创建一个新的命名空间,而不是调用 __prepare__获取该新命名空间的方法,改为使用type(clsdict)()。这样做有什么风险吗?


1__prepare__的签名:

@classmethod
def __prepare__(metacls, cls, bases, **kwds):

对于__new__

def __new__(metacls, cls, bases, clsdict, **kwds):

2 使用type(clsdict)的示例:

来自this answer

class CountryCodeMeta(enum.EnumMeta):
    def __new__(metacls, cls, bases, classdict):
        data = classdict['data']
        names = [(country['alpha-2'], int(country['country-code'])) for country in data]

  -->   temp = type(classdict)()
        for name, value in names:
            temp[name] = value

        excluded = set(temp) | set(('data',))
        temp.update(item for item in classdict.items() if item[0] not in excluded)

        return super(CountryCodeMeta, metacls).__new__(metacls, cls, bases, temp)

【问题讨论】:

【参考方案1】:

是的,有风险。

通过调用__prepare__ 而不是type(clsdict)() 来获取新命名空间至少有两个原因:

在 Python 2 上运行时,clsdictdict,而原始的 __prepare__ 从未运行过(__prepare__ 仅适用于 Python 3)——换句话说,如果 __prepare__正在返回除普通字典之外的其他内容,type(clsdict)() 不会得到它。

__prepare__clsdict 上设置的任何属性在使用type(clsdict)() 时都不会设置;即如果__prepare__ 确实clsdict.spam = 'eggs' 那么type(clsdict)() 将没有spam 属性。请注意,这些属性位于命名空间本身,供元类使用,在命名空间中不可见。

总结一下:使用__prepare__() 来获取正确的类字典是有充分理由的,而type(clsdict)() 快捷方式则没有。

【讨论】:

以上是关于python 为啥要使用静态方法的主要内容,如果未能解决你的问题,请参考以下文章

为啥Python调用方法,有的前面加类名,有的不加?

c# 为啥要合理使用静态类

为啥使用单例而不是静态方法?

java中为啥要把main方法定义为一个static方法

在java中,为啥类实例也能访问静态域?

java调用同一个类中的方法为啥要将方法申明成静态?