为什么我们要在Python中使用名称空间静态方法?

为什么我们要在Python中使用名称空间静态方法?,python,static-methods,Python,Static Methods,我们可以在类中定义静态方法,并在任何地方使用它。我的问题是,为什么即使在这个类中使用这个静态方法,我们也必须给静态方法命名名称空间,也就是说,在方法名称之前添加A. 我的想法是,我们可以简单地更改机制,使类中的静态方法名称不必是名称空间,如:(尽管Python现在不支持它): 我的直觉是,由于我们是从类内部调用,类成员的优先级应该高于全局函数,因此不会有任何歧义。为什么Python强迫我们给它命名呢?在类中定义的方法不能通过裸名称访问,除非通过直接在类名称空间中运行的代码(而不是在另一个方法中运

我们可以在类中定义静态方法,并在任何地方使用它。我的问题是,为什么即使在这个类中使用这个静态方法,我们也必须给静态方法命名名称空间,也就是说,在方法名称之前添加
A.

我的想法是,我们可以简单地更改机制,使类中的静态方法名称不必是名称空间,如:(尽管Python现在不支持它):


我的直觉是,由于我们是从类内部调用,类成员的优先级应该高于全局函数,因此不会有任何歧义。为什么Python强迫我们给它命名呢?

在类中定义的方法不能通过裸名称访问,除非通过直接在类名称空间中运行的代码(而不是在另一个方法中运行)。如果要调用方法,通常必须在某种对象(实例或类本身)上查找它。对于不同类型的查找,不同类型的方法的行为方式不同

class A(object):
    def __init__(self, val):
        self.val = plus_one(val)

    @staticmethod
    def plus_one(val):
        return val + 1

Python并不强制它。您还可以定义一个“裸”函数。但是使用静态方法可以增加代码的组织层次。@Keith我想你误解了这个问题。它是关于调用静态方法的。(我也很困惑)三个想法:1)你怎么能用相同的名字调用顶级方法?2) 您还必须使用
self.member()
,而不仅仅是调用
member()
。3) 即使是静态方法也可能过载,因此
self.plus\u one
a.plus\u one
之间存在潜在的差异。应该叫哪个?
class A(object):
    def __init__(self, val):
        self.val = plus_one(val)

    @staticmethod
    def plus_one(val):
        return val + 1
class Test(object):
    def normal_method(self, foo):
        print("normal_method", self, foo)
        # none of the method names are valid here as bare names, only via self or Test
        try:
            class_method(type(self), foo) # raises NameError
        except NameError:
            pass

        self.class_method(foo) # this works
        Test.class_method(foo) # so does this

    @classmethod
    def class_method(cls, foo):
        print("class_method", cls, foo)
        # from a class method, you can call a method via the automatically provided cls
        cls.static_method(foo)

    @staticmethod
    def static_method(foo):
        print("static_method", foo)
        # a static method can only use the global class name to call other methods
        if isinstance(foo, int) and foo > 0:
            Test.static_method(foo - 1)

    # Class level code is perilous.
    #normal_method('x', 2) # could work in Python 3 (Python 2 checks the type of self)
                           # but it probably won't be useful (since self is not an instance)
    #class_method('x', 2) # Won't work. A classmethod descriptor isn't directly callable
    #staticmethod(2)      # Nor is a staticmethod

# Top level code (these are all valid)
Test().normal_method(2) # also could be Test.normal_method(Test(), 2)
Test.class_method(2)  # could also be Test().class_method(2) (type of the instance is used)
Test.static_method(2) # could also be Test().static_method(2) (instance is ignored)