<p>好的,我第一次开始使用Python时写了这个问题。我现在知道如何在Python中做我发布的.Net示例代码所做的事情。诚然,当我最初发布这个问题时,我没有意识到的最大的事情是描述符改变了属性/属性的行为(不管你怎么称呼它们)。尽管如此,我们仍然可以允许这些属性像属性一样工作(并且不改变它们的行为),但是可以使用decorator为它们添加一些元数据。我目前正在实现一些协议序列化/反序列化的东西,这将派上用场。你知道吗</p>
<pre><code>class MyCustomDescriptor:
def __init__(self,val1,val2):d
self._val1 = val1
self._val2 = val2
@property
def val1(self): return self._val1
@property
def val2(self): return self._val2
def __call__(self,decorated_method_reference):
self._decorated_method_reference = decorated_method_reference
return self
def __get__(self,instance,type=None):
if not instance:
return self
return self._decorated_method_reference(instance)
class Foo:
def __init__(self,attribute_a_value,attribute_b_value,attribute_c_value):
self._attribute_a_value = attribute_a_value
self._attribute_b_value = attribute_b_value
self._attribute_c_value = attribute_c_value
@MyCustomDescriptor(val1="abc",val2="def")
def attribute_a(self): return self._attribute_a_value
@MyCustomDescriptor(val1="xyz",val2="X")
def attribute_b(self): return self._attribute_b_value
@property
def attribute_c(self): return self._attribute_c_value
# Show that by inspecting class Foo we can figure out which attribute are marked with MyCustomDescriptor and that
# we can get the values for val1 and val2. We don't even need an instance of Foo to do this. The class itself is sufficient.
print("Inspecting class Foo. Looking for attributes marked with MyCustomDescriptor...")
for attribute_name in dir(Foo):
attribute_as_object = getattr(Foo,attribute_name)
if type(attribute_as_object) == MyCustomDescriptor:
print("attribute "+attribute_name+" is decorated with MyCustomDescriptor. val1="+attribute_as_object.val1+" val2="+attribute_as_object.val2)
# Show that the properties on Foo work like normal properties. Note that I skipped implementing setters but could have done so.
foo_instance = Foo(attribute_a_value="X",attribute_b_value=2,attribute_c_value="Z")
print("Created an instance of Foo just for fun. It's property values are "+str(foo_instance.attribute_a)+", "+str(foo_instance.attribute_b)+", "+str(foo_instance.attribute_c))
</code></pre>
<p>输出为:</p>
<pre>
Inspecting class Foo.
Looking for attributes marked with MyCustomDescriptor...
attribute attribute_a is decorated with MyCustomDescriptor.
val1=abc val2=def
attribute attribute_b is decorated with MyCustomDescriptor.
val1=xyz val2=X
Created an instance of Foo just for fun.
It's property values are X, 2, Z
</pre>