创建一个没有实例的静态类

问题描述 投票:55回答:4

我在网上看到的所有教程都显示了如何使用 __init__ 构造方法,这样就可以声明该类型的对象,或该类的实例。

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

比如说

class World:

    allElems = []

    def addElem(x):  

        allElems.append(x)

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

EDIT

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'。

python class object static
4个回答
82
投票

创建一个静态类的Pythonic方法是简单地在类之外声明那些方法(Java既使用类来处理对象,也使用类来分组相关的函数,但Python模块足以分组相关的函数,不需要任何对象实例)。但是,如果你坚持要在类的层面上做一个不需要实例的方法(而不是简单地在模块中把它做成一个独立的函数),你可以通过使用"@staticmethod "装饰器来实现。

也就是说,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)

11
投票

有两种方法可以做到这一点 (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()

10
投票

你可以使用 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 的优点是它可以和子类一起工作,如果你真的想要这个功能的话。

但模块无疑是最好的。


2
投票

看来你需要类方法。

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
© www.soinside.com 2019 - 2024. All rights reserved.