在 Python (3.2) 中,是否可以通过反射机制获取字段名称?
请看以下示例:
class Something:
def __init__(self):
self.x = 1
def validate():
return validator.max(self.x, 10)
validator.max(self.x, 10)
应该产生一个包含字段名 x
的错误信息(在这种情况下为 "x"
)的字符串。
在 Python (3.2) 中,是否可以通过反射机制获取字段名称?
请看以下示例:
class Something:
def __init__(self):
self.x = 1
def validate():
return validator.max(self.x, 10)
validator.max(self.x, 10)
应该产生一个包含字段名 x
的错误信息(在这种情况下为 "x"
)的字符串。
def validate():
return validator.max(self, "x", 10)
def max(ob, attr, max_value):
val = getattr(ob, attr) # val would be self.x now
...
validator.max(3,10)
应该做什么?
如果想要输出名称和值,需要同时传递名称和值:
validator.max(self.x,10,"x")
self.x
只是该成员的当前值,因此丢失了该值来自对象的信息。class ValidatedObject:
def validate(self):
for name in dir(self):
if (name.startswith("validate_") and # Is a validator
not getattr(self, name)()): # and failed
raise RuntimeError("%s: %s" %
(name, getattr(self, name).__doc__))
class Something(ValidatedObject):
def __init__(self, x, y):
self.x = x
self.y = y
def validate_x(self):
"Horizontal position shouldn't be that big"
return self.x < 10
def validate_y(self):
"Vertical position must be neither too low nor too high"
return 20 <= self.y <= 30
def validate_sum(self):
"The position must be on the prescribed line"
return self.x + self.y == 25
class Something2(Something):
def validate_sum(self):
return True
Something(3, 22).validate() # Ok
Something2(5, 30).validate() # Ok (derived class relaxed checks)
print "About to crash...."
Something2(5, 31).validate() # Not ok (Y is too high - inherited check)
dir
将正确地找到继承的成员。请注意,保留HTML标记。validate()
可以被修改以在构建错误消息时提取和使用方法名中 "validate_"
后面的文本。DRY。 - martineau__doc__
并不是重复,它可以是一个与验证器名称无关的用户友好信息。在:
之前的消息中已经使用了验证器的名称(但不会删除“validate_”
)。我将添加一个编辑以使意图更加清晰... - 6502__doc__
字符串没有问题 - 只是提出了一个建议,使其更符合OP问题中所述的“获取字段名称”的要求。你想出来的东西不仅可以进行简单的字段值验证(在我看来这是一件好事)。 - martineau
self.x
和x
有点冗余。 - Noufal Ibrahim