web-dev-qa-db-ja.com

インスタンスなしで静的クラスを作成する

オンラインで見るすべてのチュートリアルでは、__init__コンストラクターメソッドを使用してクラスを作成し、そのタイプのオブジェクトまたはそのクラスのインスタンスを宣言する方法を示しています。

クラスのすべてのメソッドと属性にアクセスできるようにクラスを作成するにはどうすればよいですか(Javaでは静的)without新しいインスタンス/オブジェクトを作成する必要がありますか?

例えば:

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'は定義されていません

42
Greg Peckory

静的クラスを作成するPythonの方法は、クラスの外でそれらのメソッドを宣言することです(Javaはオブジェクトと関連関数のグループ化の両方にクラスを使用しますが、Pythonモジュールは必要のない関連関数のグループ化に十分です任意のオブジェクトインスタンス)。ただし、インスタンスを必要としないクラスレベルでメソッドを作成することに固執する場合(単にモジュール内で独立した関数にするのではなく)、「@ staticmethod」デコレーターを使用して作成できます。

つまり、Pythonの方法は次のようになります。

# 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)
68

それには2つの方法があります(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
boaz_shuster

classmethodまたはstaticmethodを使用できます

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には、その機能が本当に必要な場合にサブクラスで動作するという利点があります。

モジュールは確かに最高です。

7
Paul Rooney

クラスメソッドが必要なようです:

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
2
Eugene Soldatov