有人可以解释在Python中对象名称之前有前导下划线的确切含义吗?另外,解释单个和双重前导下划线之间的区别.此外,无论所讨论的对象是变量,函数,方法等,这个含义是否保持不变?
有没有办法在模块内部设置全局变量?当我尝试以最明显的方式执行此操作时,如下所示,Python解释器说该变量__DBNAME__不存在.
...
__DBNAME__ = None
def initDB(name):
if not __DBNAME__:
__DBNAME__ = name
else:
raise RuntimeError("Database name has already been set.")
...
Run Code Online (Sandbox Code Playgroud)
并在将模块导入另一个文件后
...
import mymodule
mymodule.initDB('mydb.sqlite')
...
Run Code Online (Sandbox Code Playgroud)
追溯是: __DBNAME__
有任何想法吗?我正在尝试使用模块来设置单例,根据这个人的建议.
我每次对属性进行更改时都使用属性来执行某些代码,如下所示:
class SomeClass(object):
def __init__(self,attr):
self._attr = attr
@property
def attr(self):
return self._attr
@attr.setter
def attr(self,value):
if self._attr != value:
self._on_change()
self._attr = value
def _on_change(self):
print "Do some code here every time attr changes"
Run Code Online (Sandbox Code Playgroud)
这非常有用:
>>> a = SomeClass(5)
>>> a.attr = 10
Do some code here every time attr changes
Run Code Online (Sandbox Code Playgroud)
但是如果我存储了一个可变对象attr,attr可以直接修改,绕过setter和我的更改检测代码:
class Container(object):
def __init__(self,data):
self.data = data
>>> b = SomeClass(Container(5))
>>> b.attr.data = 10
>>>
Run Code Online (Sandbox Code Playgroud)
让我们假设它attr只会用于存储类型的对象Container.是否有修改一个优雅的方式SomeClass和/或 …
我在写一个银行应用程序Python,并从这里读了一些源代码的银行应用程序.该balance课程定义如下:
class Balance(object):
""" the balance class includes the balance operations """
def __init__(self):
""" instantiate the class """
self.total = 0
def add(self, value):
""" add value to the total
Args:
value (int): numeric value
"""
value = int(value)
self.total += value
def subtract(self, value):
""" subtract value from the total
Args:
value (int): numeric value
"""
value = int(value)
self.total -= value
Run Code Online (Sandbox Code Playgroud)
我的问题
由于不应该在类之外访问余额细节,我们应该定义属性self.total,self.__total因为我们应该使它变得private相当public可变?我的思路是否正确?
所以我得到了这段代码:
class MyClass:
ACTIONS = {
"ACTION_A": MyClass.__a,
"ACTION_B": MyClass.__b
}
@staticmethod
def do(constant):
ACTIONS[constant]()
@staticmethod
def __a():
print("A")
@staticmethod
def __b():
print("B")
Run Code Online (Sandbox Code Playgroud)
我正在尝试将私有__a和__b函数映射到静态字典,因此我可以使用方法do执行函数.
尝试运行此代码时,我得到错误:ACTIONS字典的每一行上的" 未解析的引用'MyClass' " .
有关如何使其正常工作的任何想法?