如何查找python用户定义类的属性?

如何查找python用户定义类的属性?,python,object,Python,Object,请参阅下面的示例代码,它位于一个文件中,例如 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

请参阅下面的示例代码,它位于一个文件中,例如

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
我想在创建任何实例之前获取类的所有属性(我假设
param1
param2
等都称为属性)。命令
dir(classattr.BaseClass)
不列出
param1
param2
。但是,它确实返回方法
somemethod

我尝试获取属性的原因如下:模块
classattr
导入到另一个文件中,其中类的名称
classattr.BaseClass
classattr.ChildOfBaseClass
作为某个函数的输入提供。我想在运行时确定它是哪一个,然后在创建实例时使用适当的输入(如果是前者,则使用
param1
param2
,如果是后者,则使用所有参数
param1
param4
)。我考虑这样做的方式是检查类是否将
param3
作为属性,然后使用正确的输入创建实例。还有更好的检查方法吗?另一种方法是将
param3
param4
作为
BaseClass
中的输入,即使它们不做任何操作,然后始终使用所有四个参数作为输入创建实例。但这似乎并不合适


谢谢。

在不实际创建实例的情况下,无法获得仅在创建对象后才分配的属性名称,如
\uuuuu init\uuuu()
中定义的属性名称。
\uuuu init\uuuu()
方法可以做任何事情,并且实例可能会被甚至不在类中的代码进一步修改。因此,如果你想知道一个实例有哪些属性,你需要一个实例。

在没有实际创建实例的情况下,没有真正的方法来获取仅在创建对象之后才分配的属性的名称,例如在
\uuu init\uuuu()中定义的属性。
\uuuu init\uuuu()
方法可以做任何事情,并且实例可能会被甚至不在类中的代码进一步修改。因此,如果您想知道一个实例具有哪些属性,您需要一个实例。

您无法知道一个类将为其实例提供哪些实例属性,因为它们在创建实例之前不存在

但是,如果您想知道实例化该类时需要传递哪些参数,那么可以检查该类的
\uuuu init\uuu
方法的调用签名,查看它接受哪些参数。有关获取呼叫签名的一些信息,请参阅

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

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

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

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

但是,如果您想知道实例化该类时需要传递哪些参数,那么可以检查该类的
\uuuu init\uuu
方法的调用签名,查看它接受哪些参数。有关获取呼叫签名的一些信息,请参阅

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

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

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

BrenBarn的答案将引导您找到一些可能帮助您解决问题的想法。我只是想在术语上加一些注释

在Python中,对象的属性是存储在其中的命名值(对象几乎就是“具有属性的东西”)。它们是用
虚线.name
语法检索的

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

实际上,
dir(classattr.BaseClass)
正在做的一件事就是查找
classattr.BaseClass
的属性,在那里它找到了
somethod
属性,但没有找到
param1
param2
,因为它们不是类对象的属性;一旦创建并初始化了
基类
的实例,它们(将)成为这些实例的属性


但您真正想问的是如何找到给定类的
\uuuu init\uuuu
方法的调用签名。正如BrenBarn所指出的,尽管类通常被编写为直接初始化其实例的属性(从参数到
\uuuu init\uuuu
),但绝对不能保证这种情况。但是,如果您的目的只是为了知道为了创建实例要向类传递哪些信息,那么您不需要知道(也不应该关心)哪些信息最终会存储为属性,但是,确切地说,
\uuu init\uuu
方法所需的参数是什么。

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

在Python中,属性