Introspecting arguments from the constructor function __init__ in Python
什么是从__init__提取参数而不创建新实例的方法。
代码示例:
1 2 3
| class Super:
def __init__(self, name):
self.name = name |
我看起来像Super.__dict__.keys()类型的解决方案。 只是为了检索名称参数信息而不添加任何值。 有这样的选择吗?
-
问题不明确。 您是说要检查名称的值并决定是否要创建新实例?
-
我根本不想创建实例。 我想内省对象参数。 这就像问题"这个对象有什么论据"。 这完全是关于价值观的一般内省。 我改变了问题,使其更容易理解。
-
实例已在__init__被调用时创建。 请参阅此答案stackoverflow.com/questions/674304/pythons-use-of-new-and-init
您可以使用inspect
1 2 3 4
| >>> import inspect
>>> inspect.getargspec(Super.__init__)
ArgSpec(args=['self', 'name'], varargs=None, keywords=None, defaults=None)
>>> |
编辑:inspect.getargspec实际上并不创建Super的实例,见下文:
1 2 3 4 5 6 7 8
| import inspect
class Super:
def __init__(self, name):
print 'instantiated'
self.name = name
print inspect.getargspec(Super.__init__) |
这输出:
1 2 3
| ### Run test.a ###
ArgSpec(args=['self', 'name'], varargs=None, keywords=None, defaults=None)
>>> |
请注意,instantiated从未打印过。
-
看起来这就是我在寻找的东西。还有一个问题:是否有选项可以在没有"检查"模块的情况下获得该结果。像Super .__ dict __。keys解决方案,如果不是,这意味着inspect.getargspec()就像有助于检索参数的实例模拟?
-
从函数中检索参数名称有很多答案 - stackoverflow.com/questions/582056/…看起来像检查是唯一的方法。即使在函数调用中使用globals也会返回,这不是您想要的。顺便说一句,使用inspect不会导致函数调用,编辑我的答案为例...
-
@ Vy.Iv看到更新的答案。
-
@Bahrom无论如何要为继承类的层次结构做到这一点?
-
@VeltzerDoron我回家后会看看
-
实际上,我已经通过向上移动class.mro()并沿途获取init签名来实现它,我用它来编写一个自定义JSON编码器,它不使用默认值编码成员,就像一个魅力。 :)