这一切都在标题中.以下是以下示例:
class A(object):
my_var = 5
def my_method(self, drink='beer'):
return 'I like %s' % drink
@property
def my_property(self):
return 'I do not drink coffee'
Run Code Online (Sandbox Code Playgroud)
我实例化一个A对象,我想知道每个属性的类型,以及它是否可调用.为此,我正在使用dir().
obj = A()
for attr in dir(obj):
print 'Type: %s' % type(obj)
print 'Is callable: %s' % callable(attr)
Run Code Online (Sandbox Code Playgroud)
我还必须知道属性是否属性.我确信有办法知道这一点.所有建议将不胜感激.
kin*_*all 25
我曾经问过类似的问题.当然,您遇到的麻烦是,您无法通过实例访问属性以确定其类型而无需调用getter,这将获取getter返回的类型.因此,您必须通过其类而不是通过实例访问该属性.
property已经是一种类型,所以你可以直接比较它.(我最初在这里有一些多余的代码,它们从具有属性的类中获取属性类型.我认为这是必要的,因为我在测试时会出现错字.)
obj_type = type(obj)
for attr in dir(obj):
if isinstance(getattr(type(obj), attr, None), property):
print attr, "is a property"
Run Code Online (Sandbox Code Playgroud)
不要担心具有相同名称的实例属性.如果类上有相同名称property的数据描述符(是数据描述符),则在属性查找中忽略它.
当然,任何类都可以是数据描述符,而不仅仅是property,所以理论上你真的想检查类型__get__()和/或__set__()和/或__delete__() 属性.但是这种方法的问题在于所有函数和方法本身都是描述符,因此会被检查所捕获.试图找到所有异常很快就变得愚蠢.
Joh*_*ooy 23
您需要查看类(通常是描述符的情况),对于可以通过类 attribut或使用类型函数找到的对象:
>>> obj.__class__.my_property
<property object at 0xb74bd16c>
Run Code Online (Sandbox Code Playgroud)
要么
>>> type(obj).my_property
<property object at 0xb720b93c>
Run Code Online (Sandbox Code Playgroud)
这会产生相同的"属性对象",就好像你要直接检查类的属性一样(暗示你在代码中知道类的名称,而不是像你可能应该那样动态地检查它):
>>> A.my_property
<property object at 0xb7312345>
Run Code Online (Sandbox Code Playgroud)
因此,为了测试对象的特定属性是否属于属性,这将是一个解决方案:
>>> isinstance(type(obj).my_property, property)
True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9892 次 |
| 最近记录: |