我有一个python类(实际上它是一个Google App Engine模型),看起来像这样:
class MyClass(ParentClass):
variable_one = PropertyClass(...)
variable_two = PropertyClass(...)
我打算构建一个系统,该系统可以描述此类的两个实例之间的差异,这些实例在不同时间点表示实体的两个版本。最终它会产生一个字符串,例如
"Variable One changed from 'foo' to 'bar', Variable Two changed from empty to 'baz'"
因此,我需要在某个地方存储"variable_one"应显示为"变量一"的事实,依此类推。来自 C# 背景,我的直觉是使用 Attributes,例如:
class MyClass : ParentClass
{
[DisplayName("Variable One")]
public PropertyClass variable_one;
[DisplayName("Variable Two")]
public PropertyClass variable_two;
}
起初,python 等价物似乎是装饰器:
class MyClass(ParentClass):
@display_name("Variable One")
variable_one = PropertyClass(...)
@display_name("Variable Two")
variable_two = PropertyClass(...)
然而,装饰器实际上是在做函数柯里,并且由于类变量定义只是将 PropertyClass 的一个实例分配给variable_one并且variable_two它看起来不像是有效的 python。无论如何,我不确定我该怎么写。
一种选择似乎是扩展属性类...
class MyClass(ParentClass):
variable_one = MyPropertyClass("Variable One", ...)
variable_two = MyPropertyClass("Variable Two", ...)
但是使用了几种不同的属性类,我想向所有这些属性类添加一个常见的行为,所以这似乎太费力了。
我想我可以定义一个字典:
class MyClass(ParentClass):
variable_one = PropertyClass(...)
variable_two = PropertyClass(...)
variable_display_names = {
"variable_one": "Variable One",
"variable_two": "Variable Two"
}
但我希望从一些更有经验的pythoner那里听到实现这一目标的最佳方法。
数据存储属性类是描述符(如 python @property
装饰器),但作为不实现__setattr__
的自定义类,您可以在这些对象上设置任意属性:
class MyClass(ParentClass):
variable_one = PropertyClass(...)
variable_one.display_name = "Variable One"
variable_two = PropertyClass(...)
variable_two.display_name = "Variable Two"
可以推广到装饰器:
def display_name(dispname):
def decorate_with_display_name(prop):
prop.display_name = dispname
return prop
return decorate_with_display_name
只要通过类(而不是实例)访问属性,就可以再次检索这些值;例如,给定一个实例,您可以执行print type(instance).variable_two.display_name
。