我可以使用元类初始化错位名称并且安全吗?
class MetaA(type):
def __new__(metaCls, name, bases, clsDict):
clsDict['_%s__counter' % name] = 0
return super(MetaA, metaCls).__new__(metaCls, name, bases, clsDict)
class A(object):
__metaclass__ = MetaA
我搜索过但没有找到明确的解释。我经常使用损坏的名称,但很少使用元类,并且如果有效'_%s__%s' % (className, attrName)
则不确定这样的代码 - 它可以工作,但可能不兼容。
答案 0 :(得分:0)
您要求做的是合法的,或多或少的安全(尽可能安全地访问属性的名称暗示他们是私有的)。从设计的角度来看,这可能不是一个好主意。
问题是,为什么你首先使用受损的名字?如果要从多个类(包括类及其元类的访问)访问该属性,则可能应该使用未编码的属性名称。
如果您经常发现自己需要解决属性的重复问题,那么您可能过度使用了错误的名称。使用单个前导下划线表示名称是"私有" (或者至少,不属于一个类的稳定的公共API)。
只有少数类需要修改名称,通常是因为您希望保留其属性命名空间" clean"由于某些原因。例如,代理类可能希望其属性名称空间像目标objcecte的副本一样工作。使用损坏的名称可以帮助防止代理的实例变量隐藏任何目标的属性。