0

请看下面的示例代码,它在一个文件中,比如说

classattr.py

class BaseClass(object):
    def __init__(self, param1, param2):
        self.param1 = param1
        self.param2 = param2

    def somemethod(self):
        return "This is returned when I do Base.__dict__"

class ChildOfBaseClass(BaseClass):
    def __init__(self, param1, param2, param3, param4):
        super(ChildOfBaseClass, self).__init__(param1, param2)
        self.param3 = param3
        self.param4 = param4

    def somemethod(self, param3, param4):
        a = param3 + param4
        return a

我想在创建任何实例之前获取类的所有属性(我假设param1param2称为属性)。命令dir(classattr.BaseClass)不列出param1param2。但是,它确实返回了 method somemethod

我试图获取属性的原因如下: 模块classattr被导入到另一个文件中,其中类的名称classattr.BaseClass或者classattr.ChildOfBaseClass作为某个函数的输入提供。我想在运行时确定它是哪一个,然后在创建实例时使用适当的输入(如果是前者,或者是后者的所有参数param1)。我正在考虑这样做的方式是检查该类是否具有属性,然后使用正确的输入创建实例。还有其他更好的检查方法吗?另一种方法是将和作为输入param2param1param4param3param3param4BaseClass即使他们什么都不做,然后总是用所有四个参数作为输入来创建实例。但这似乎不是合适的做事方式。

谢谢你。

4

3 回答 3

2

没有真正的方法可以获取仅在创建对象后才分配的属性名称,例如在 中定义的属性名称__init__(),而无需实际创建实例。该__init__()方法可以做任何事情,并且一个实例可能已经被甚至不在类中的代码进一步修改。所以如果你想知道一个实例有什么属性,你需要一个实例。

于 2012-06-04T00:31:40.523 回答
2

您无法知道类将赋予其实例哪些实例属性,因为在创建实例之前它们不存在。

但是,如果您想知道在实例化类时需要传递哪些参数,则可以检查类__init__方法的调用签名以查看它接受哪些参数。有关获取调用签名的一些信息,请参阅确定 lambda 中的参数数量。

__init__请注意,实例属性和参数之间没有内在关系。你可以有这样的课程:

class Foo(object):
    def __init__(self):
        self.someAttr = 10

. . . 它定义了一个实例属性而不接收任何参数。(反之亦然,一个接受参数但不使用它们来创建实例属性的类。)

于 2012-06-04T00:33:36.357 回答
1

BrenBarn 的回答将引导您找到一些可能帮助您解决问题的想法。我只是想我会添加一些关于术语的注释。

在 Python 中,对象的属性是存储在其中的命名值(对象几乎无非就是“具有属性的事物”)。它们是使用dotted.name语法检索的。

Python 中的类是对象。因此它们具有属性。最重要的是您在class块中定义的所有名称(包括方法),它们成为类对象的属性。因此,当您询问类的属性时,听起来您想要检索类对象本身的属性,但实际上并非如此。

确实其中一件事dir(classattr.BaseClass)是查找 的属性classattr.BaseClass,它在哪里找到somemethod属性,但没有找到param1,或者param2因为它们不是类对象 的属性BaseClass;一旦这些实例被创建和初始化,它们(将是)实例的属性。BaseClass

但是您似乎真正要问的是如何找出__init__给定类的方法的调用签名。正如 BrenBarn 所指出的,尽管类通常被编写为简单地直接从参数初始化其实例的属性 到__init__,但绝对不能保证确实如此。但是,如果您的目的只是为了知道要传递给类以创建实例的信息,那么您不需要知道(也不应该关心)最终将存储为属性的内容,而只是知道什么是__init__方法的必需参数。

于 2012-06-04T02:34:30.660 回答