创建没有实例的静态类

时间:2015-05-31 11:28:54

标签: python class object static

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

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

例如:

class World:

    allElems = []

    def addElem(x):  

        allElems.append(x)

World.addElem(6)
print(World.allElems)

修改

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]))

错误:名称'allAirports'未定义

4 个答案:

答案 0 :(得分:56)

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

也就是说,Pythonic的方式是:

# My module
elements = []

def add_element(x):
  elements.append(x)

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

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

  @staticmethod
  def add_element(x):
    World.elements.append(x)

如果您想了解特定的类(如果您希望允许静态方法继承自此类的类继承,则可以使用@classmethod)来执行此操作:

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

  @classmethod
  def add_element(cls, x):
    cls.elements.append(x)

答案 1 :(得分:9)

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

静态方法

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

Klass.static_method()

模块

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

def static_method():
    print "Hello World"

您的代码:

import klass

klass.static_method()

答案 2 :(得分:5)

您可以使用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
如果你真的想要这个功能,

classmethod的优势在于它适用于子类。

模块当然是最好的。

答案 3 :(得分:2)

似乎你需要classmethod:

class World(object):

    allAirports = []

    @classmethod
    def initialize(cls):

        if not cls.allAirports:
            f = open(os.path.expanduser("~/Desktop/1000airports.csv"))
            file_reader = csv.reader(f)

            for col in file_reader:
                cls.allAirports.append(Airport(col[0],col[2],col[3]))

        return cls.allAirports