【问题标题】:Introspecting arguments from the constructor function __init__ in Python在 Python 中自省构造函数 __init__ 的参数
【发布时间】:2016-08-19 09:22:57
【问题描述】:

什么是从__init__ 提取参数而不创建新实例的方法。 代码示例:

class Super:
    def __init__(self, name):
        self.name = name

我正在寻找类似Super.__dict__.keys()type 的解决方案。只是为了检索名称参数信息而不添加任何值。有这样的选择吗?

【问题讨论】:

  • 问题不清楚。您的意思是要检查名称的值并决定是否要创建新实例?
  • 我根本不想创建实例。我想反省对象参数。这就像问题“这个对象有什么论据”。这完全是关于一般内省,而不是关于价值观。我更改了问题以使其更容易理解。
  • 在调用__init__ 时已经创建了实例。看到这个答案stackoverflow.com/questions/674304/pythons-use-of-new-and-init

标签: python oop arguments introspection


【解决方案1】:

Python 3.3+ 的更新(正如 cmets 中的 beeb 所指出的那样)

可以使用 Python 3.3 中引入的inspect.signature:

class Super:
    def __init__(self, name, kwarg='default'):
        print('instantiated')
        self.name = name

>>> import inspect
>>> inspect.signature(Super.__init__)
<Signature (self, name, kwarg='default')>

原答案如下

你可以使用inspect

>>> import inspect
>>> inspect.getargspec(Super.__init__)
ArgSpec(args=['self', 'name'], varargs=None, keywords=None, defaults=None)
>>> 

编辑:inspect.getargspec 实际上并没有创建Super 的实例,见下文:

import inspect

class Super:
    def __init__(self, name):
        print 'instantiated'
        self.name = name

print inspect.getargspec(Super.__init__)

这个输出:

### 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 不会导致函数调用,例如编辑我的答案...
  • @Bahrom 无论如何都要为继承类的层次结构执行此操作?
  • 实际上,我已经通过遍历 class.mro() 并一路获取 init 签名来实现它,我用它编写了一个自定义 JSON 编码器'不使用默认值编码成员,就像一个魅力。 :)
  • DeprecationWarning:inspect.getargspec() 自 Python 3.0 起已弃用,请使用 inspect.signature() 或 inspect.getfullargspec()
猜你喜欢
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多