オンラインで見るすべてのチュートリアルでは、__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'は定義されていません
静的クラスを作成する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)
それには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()
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
には、その機能が本当に必要な場合にサブクラスで動作するという利点があります。
モジュールは確かに最高です。
クラスメソッドが必要なようです:
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