我已经看到了以下问题,但它并没有让我想到我想要的地方:如何在Python中获取当前模块中所有类的列表?
特别是,我不想要导入的类,例如,如果我有以下模块:
from my.namespace import MyBaseClass
from somewhere.else import SomeOtherClass
class NewClass(MyBaseClass):
pass
class AnotherClass(MyBaseClass):
pass
class YetAnotherClass(MyBaseClass):
pass
Run Code Online (Sandbox Code Playgroud)
如果我使用clsmembers = inspect.getmembers(sys.modules[__name__], inspect.isclass)链接问题中的接受答案建议,它将返回MyBaseClass并且SomeOtherClass除了本模块中定义的3之外.
我怎么才能得到NewClass,AnotherClass而且YetAnotherClass?
任何人都可以从语言/环境不可知的角度解释这两个概念之间的区别吗?
还有一组编程语言需要满足的条件才能反思和/或内省吗?
如果有,这些条件是什么?
我很好奇为什么Ruby的内省相关方法来检查对象是否响应方法respond_to?而不是responds_to?
这对我来说似乎总是很尴尬,但也许那是因为我习惯于respondsToSelector客观c.
在Objective-C中,我可以测试给定的类或实例是否响应某些选择器.但是如何查询类或实例的所有方法或类的属性(例如所有方法或属性的列表)?
我有一个Java对象obj具有属性obj.attr1,obj.attr2等属性通过额外的间接水平可能访问:obj.getAttr1(),obj.getAttr2(),如果不公开.
挑战:我想一个函数,一个对象,并返回一个Map<String, Object>,其中的键是字符串"attr1","attr2"等等和值对应的对象obj.attr1,obj.attr2.我想这个函数会被调用
toMap(obj),toMap(obj, "attr1", "attr3")(其中attr1和attr3是obj属性的子集),toMap(obj, "getAttr1", "getAttr3")如果有必要的话.我对Java的内省了解不多:你是如何用Java做的?
现在,我toMap()对每个我关心的对象类型都有一个专门的实现,而且它太多样板了.
注意:对于那些了解Python的人,我想要类似的东西obj.__dict__.或者dict((attr, obj.__getattribute__(attr)) for attr in attr_list)对于子集变体.
如何检查对象是否是命名元组的实例?
我试图获取模型中的字段的类信息,当我只知道字段的名称和模型的名称(两个普通字符串).这怎么可能?
我可以动态加载模型:
from django.db import models
model = models.get_model('myapp','mymodel')
Run Code Online (Sandbox Code Playgroud)
现在我有场 - 'myfield' - 我怎么能得到那个领域的班级?
如果该字段是关系型的 - 如何获取相关字段?
谢谢你!
给定任何对象我可以调用#public_methods并查看它将响应的所有方法.但是,我发现有时候获得一个没有继承的所有公共方法的快速列表是有用的,也就是那些真正属于这个类的东西.
我找到了" 简单的方法列出Ruby对象的公共方法 ",如果我使用:
(Foo.public_methods - Object.public_methods).sort
Run Code Online (Sandbox Code Playgroud)
我可以过滤掉很多基本的Ruby东西.我希望能够过滤掉链条上一直延续的所有内容.如果我知道父类我可以使用它进行过滤,但我想提出一个通用命令,它可以返回任何对象的未公开公共方法的数组.
我一直在尝试确定类中字段的类型.我已经看到了所有的内省方法,但还没有弄清楚如何做到这一点.这将用于从java类生成xml/json.我在这里看了很多问题,但还没找到我需要的东西.
例:
class Person {
public final String name;
public final List<Person> children;
}
Run Code Online (Sandbox Code Playgroud)
当我编组这个对象时,我需要知道该chidren字段是一个类型对象的列表Person,所以我可以正确地编组它.
我试过了
for (Field field : Person.class.getDeclaredFields()) {
System.out.format("Type: %s%n", field.getType());
}
Run Code Online (Sandbox Code Playgroud)
但是,这只会告诉我,这是一个List,不是List的Person小号
谢谢
introspection ×10
python ×3
java ×2
reflection ×2
ruby ×2
generics ×1
isinstance ×1
namedtuple ×1
objective-c ×1
perl ×1
python-2.7 ×1
types ×1