我正在尝试列出类的可设置属性。
使用2个答案:list properies of class和know if properies is settable。
对于这个课程,它可以工作。
class A(object):
def __init__(self):
self._var_a = 1
self._var_b = 2
@property
def var_a(self):
return self._var_a
@var_a.setter
def var_a(self, value):
self._var_a = value
@property
def var_b(self):
return self._var_b
@property
def settable_property(self):
settable_properties = {}
for name, value in self.__class__.__dict__.iteritems():
if isinstance(value, property) and value.fset is not None:
settable_properties[name] = value
return settable_properties
a = A()
a.settable_property
我得到{' var_a&#39 ;: property_object}。
但对于一个儿童班:
class B(A):
def __init__(self):
self._var_c = 1
super(B, self).__init__()
@property
def var_c(self):
return self._var_c
@var_c.setter
def var_c(self, value):
self._var_c = value
b = B()
b.settable_property
我只得到{' var_c':property_object}。我期待{' var_c&#39 ;: property_object,' var_a&#39 ;: property_object}
我知道这是由于自我。类。 dict 只返回类的dict而不是所有父类。 class namespace
所以我的问题是他们可以获得一个等同于 dict 的班级及其所有人的父母?
我尝试使用dir(self),它确实为我提供了所有属性的名称,但它并没有给我属性对象。并使用getattr(self,' property_name')返回属性的.fget()值,而不是属性对象。
vars(B)也只返回{' var_b&#39 ;: property object}
答案 0 :(得分:1)
def settable_property(self):
settable_properties = {}
for name, value in inspect.getmembers(self.__class__):
if isinstance(value, property) and value.fset is not None:
settable_properties[name] = value
return settable_properties
使用dir和getattr的其他解决方案:
def settable_property(self):
settable_properties = {}
for name in dir(self.__class__:
value = getattr(self.__class__, name) # getattr on class not instance
if isinstance(value, property) and value.fset is not None:
# WARNING this property object is not bound to an instance
# if you want to use it either pass the instance like:
# value.fget(self)
# or bind the function to the instance:
# value = value.fget.__get__(self, self.__class__)
settable_properties[name] = value
return settable_properties