我可以使用Python中的元类初始化受损名称并且它是否安全?

时间:2014-04-21 12:09:59

标签: python metaclass

我可以使用元类初始化错位名称并且安全吗?

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)则不确定这样的代码 - 它可以工作,但可能不兼容。

1 个答案:

答案 0 :(得分:0)

您要求做的是合法的,或多或少的安全(尽可能安全地访问属性的名称暗示他们是私有的)。从设计的角度来看,这可能不是一个好主意。

问题是,为什么你首先使用受损的名字?如果要从多个类(包括类及其元类的访问)访问该属性,则可能应该使用未编码的属性名称。

如果您经常发现自己需要解决属性的重复问题,那么您可能过度使用了错误的名称。使用单个前导下划线表示名称是"私有" (或者至少,不属于一个类的稳定的公共API)。

只有少数类需要修改名称,通常是因为您希望保留其属性命名空间" clean"由于某些原因。例如,代理类可能希望其属性名称空间像目标objcecte的副本一样工作。使用损坏的名称可以帮助防止代理的实例变量隐藏任何目标的属性。