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)
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”的。
示例用例:单例类,我在其中注册用于类型之间转换的处理程序。
干杯!
你可以使用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
Run Code Online (Sandbox Code Playgroud)
classmethod 如果你真的想要这个功能,那么它可以用于子类.
模块肯定是最好的.