是否有可能在python中有静态类变量或方法?这样做需要什么语法?
似乎有很多方法可以在Python中定义单例.Stack Overflow是否有共识?
当阅读python文档和各种邮件列表时,我总是阅读看起来有点像教条的内容.全局变量应该像地狱一样避免,它们设计很差......好吧,为什么不呢?但是有一些真实的生活情况,我不知道如何避免这种模式.
假设我有一个GUI,可以从主菜单中加载几个文件.可以在所有GUI(例如,将显示图像并且可以通过不同对话框/插件在其上执行各种动作的图像查看器)上使用与加载的文件相对应的文件对象.
构建以下设计是否有问题:
其中Globals.py将存储一个字典,其字符是已加载文件的名称和相应文件对象的值.然后,从那里,需要这些数据的代码的各个部分将通过弱引用访问它.
对不起,如果我的问题看起来(或是)很愚蠢,但你看到任何优雅或全球免费的替代品吗?一种方法是将加载的数据字典封装在Main.py的主应用程序类中,将其视为GUI的中央访问部分.然而,这也会带来一些复杂性,因为这个类应该可以从所有需要数据的对话框中轻松访问,即使它们是必要的直接子代.
非常感谢你的帮助
我有一个像这样的单身人士
class Singleton:
class __impl:
def __init__(self):
print "INIT"
__instance = None
def __init__(self):
# Check whether we already have an instance
if Singleton.__instance is None:
Singleton.__instance = Singleton.__impl()
# Store instance reference as the only member in the handle
self.__dict__['_Singleton__instance'] = Singleton.__instance
def __getattr__(self, attr):
""" Delegate access to implementation """
return getattr(self.__instance, attr)
def __setattr__(self, attr, value):
""" Delegate access to implementation """
return setattr(self.__instance, attr, value)
Run Code Online (Sandbox Code Playgroud)
当我做了几个Singleton的实例时,我得到了两个init的调用,我的意思是"INIT"被打印了两次,我觉得它不应该发生
有人知道这有什么问题或有更好的方法来实现这个?
我对此进行了很多搜索,但似乎找不到任何特定于我的问题的内容。
假设我有三个独立的 python 文件 fileA.py、fileB.py 和 fileMain.py
fileB.py 继承自 fileA.py。
文件A.py
class Parent():
def __init__(self):
self.valueA = 5
Run Code Online (Sandbox Code Playgroud)
文件B.py
from fileA import Parent
class Child(Parent):
def __init__(self):
Parent.__init__():
self.valueB = 10
def Calculate(self):
self.result = self.valueB + self.valueA
print(self.result)
Run Code Online (Sandbox Code Playgroud)
在 fileMain.py 中,我有一些代码在父类中的 valueA 更改后调用子类中的计算方法。
from fileA import Parent
from fileB import Child
class MainProgram():
def __init__(self):
self.parent = Parent()
self.child = Child()
self.parent.valueA = 8
self.child.Calculate()
foobar=MainProgram()
Run Code Online (Sandbox Code Playgroud)
我的问题是,打印输出是 15 而不是 18。为什么?我怎样才能解决这个问题以获得预期的结果?
我希望 fileB.py 从 fileA.py 继承的原因是我计划让 fileC.py 也从 fileA.py 继承,并使用 …
我只是偶然发现网络,发现这些有趣的代码被剪掉了:
http://code.activestate.com/recipes/66531/
class Borg:
__shared_state = {}
def __init__(self):
self.__dict__ = self.__shared_state
# and whatever else you want in your class -- that's all!
Run Code Online (Sandbox Code Playgroud)
我理解单身是什么,但我不明白特定的代码被剪断了.你能解释一下"__shared_state"是如何/甚至根本改变的?
我在ipython中尝试过:
In [1]: class Borg:
...: __shared_state = {}
...: def __init__(self):
...: self.__dict__ = self.__shared_state
...: # and whatever else you want in your class -- that's all!
...:
In [2]: b1 = Borg()
In [3]: b2 = Borg()
In [4]: b1.foo="123"
In [5]: b2.foo
Out[5]: '123'
In [6]:
Run Code Online (Sandbox Code Playgroud)
但不能完全理解这是怎么发生的.
我是一个Python noob.
我按如下方式创建了一个类:
class t1:
x = ''
def __init__(self, x):
self.x = x
class t2:
y = ''
z = ''
def __init__(self, x, y, z):
self.y = t1.__init__(x)
self.z = z
Run Code Online (Sandbox Code Playgroud)
现在与C++或Java相反,我在编写类定义时不会将数据类型绑定到y.这只是因为构造函数代码表明y的类型为t1.我们可以在声明y的同时绑定数据类型吗?
我已经阅读了许多解释如何在python中实现单例的文章,比如 在Python中创建单例
我很想知道,不是一个带类方法的类,属性是一个单例类.
例如
class my_singleton_class(object):
_logger = Logger ()
_printer = Printer ()
@classmethod
def logger(cls):
return cls._logger
@classmethod
def printer(cls):
return cls._printer
Run Code Online (Sandbox Code Playgroud)
它不是pythonic吗?这个单例实现有什么问题?
python ×7
singleton ×3
class ×1
init ×1
oop ×1
python-2.7 ×1
python-3.x ×1
static ×1
variables ×1