创建没有实例的静态类

Gre*_*ory 45 python static class object

我在网上看到的所有教程都展示了如何使用__init__构造函数方法创建类,以便可以声明该类型的对象或该类的实例.

如何创建一个类(Java中的静态),以便我可以访问该类的所有方法和属性,无需创建新的实例/对象?

例如:

class World:

    allElems = []

    def addElem(x):  

        allElems.append(x)

World.addElem(6)
print(World.allElems)
Run Code Online (Sandbox Code Playgroud)

编辑

class World(object):

    allAirports = []

    @staticmethod
    def initialize():

        f = open(os.path.expanduser("~/Desktop/1000airports.csv"))
        file_reader = csv.reader(f)

        for col in file_reader:

            allAirports.append(Airport(col[0],col[2],col[3]))
Run Code Online (Sandbox Code Playgroud)

错误:未定义名称"allAirports"

Mic*_*yan 72

Pythonic创建静态类的方法只是在类之外声明这些方法(Java使用类来表示对象和分组相关函数,但Python模块足以分组不需要任何对象实例的相关函数).但是,如果你坚持在类级别创建一个不需要实例的方法(而不是简单地在模块中使它成为一个独立的函数),你可以使用"@staticmethod"装饰器来实现.

也就是说,Pythonic的方式是:

# My module
elements = []

def add_element(x):
  elements.append(x)
Run Code Online (Sandbox Code Playgroud)

但是如果你想镜像Java的结构,你可以这样做:

# My module
class World(object):
  elements = []

  @staticmethod
  def add_element(x):
    World.elements.append(x)
Run Code Online (Sandbox Code Playgroud)

@classmethod如果你想知道特定的类(如果你想允许静态方法继承自这个类的类继承),你也可以这样做:

# My module
class World(object):
  elements = []

  @classmethod
  def add_element(cls, x):
    cls.elements.append(x)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,_Pythonic 方式_ 仅适用于方法,并且**为字段创建了问题**,因为如果用户通过`from module import field` 导入字段,则他们会在导入时使用该值。 (5认同)
  • 很好的答案,但是 PEP8 是否会影响到这一点? (3认同)

boa*_*ter 10

有两种方法可以做到这一点(Python 2.6+):

静态方法

class Klass(object):
    @staticmethod
    def static_method():
        print "Hello World"

Klass.static_method()
Run Code Online (Sandbox Code Playgroud)

你的模块文件,名为klass.py

def static_method():
    print "Hello World"
Run Code Online (Sandbox Code Playgroud)

你的代码:

import klass

klass.static_method()
Run Code Online (Sandbox Code Playgroud)


Bar*_*rns 10

古老的线索,但实现这项工作的一种方法是:

class Static:
  def __new__(cls):
    raise TypeError('Static classes cannot be instantiated')
Run Code Online (Sandbox Code Playgroud)

然后,您可以像这样使用它:

class Foo(Static): ...
Run Code Online (Sandbox Code Playgroud)

无论如何,对我来说这似乎是最“Pythonic”的。

示例用例:单例类,我在其中注册用于类型之间转换的处理程序。

干杯!


Pau*_*ney 7

你可以使用classmethodstaticmethod

class Paul(object):
    elems = []

    @classmethod
    def addelem(cls, e):
        cls.elems.append(e)

    @staticmethod
    def addelem2(e):
        Paul.elems.append(e)

Paul.addelem(1)
Paul.addelem2(2)

print Paul.elems
Run Code Online (Sandbox Code Playgroud)

classmethod 如果你真的想要这个功能,那么它可以用于子类.

模块肯定是最好的.