如何获取在 __init__ 参数中创建的对象的 class

How to get class of object being created in __init__ parameters

所以我正在尝试创建一个 class 初始化方法,该方法需要获取正在创建的对象的类型,以便正确设置初始化参数的默认值。

举一个具体的代码示例,假设我有以下 class:

def __init__(self, foo, bar=type(self).some_class_variable, ham=type(self).some_other_class_variable):
        self.foo = foo
        self.bar = bar
        self.ham = self.some_function(ham)

这是我正在寻找的功能,但我的 IDE 说的是 "self" is not defined 我可以理解,因为 self 尚未实例化。所以我的问题是我将如何正确实施呢?我不想在我当前拥有 type(self) 的地方“硬编码”class 类型,因为此 class 的子 class 可能有自己的 [=16= 值] 和 some_other_class_variable 我希望那些子 classes 使用与其类型对应的 class 变量。

我的解决方案需要在 Python 3.6 和 Python 3.7 中工作,但如果可能的话,我真的更希望找到一个适用于 Python 3.6 及更高版本的所有版本的解决方案。

我认为你应该把它放在正文中,而不是参数中。

def __init__(self, foo):
        self.foo = foo
        self.bar = type(self).some_class_variable
        self.ham = self.some_function(type(self).some_other_class_variable)

编辑: 如果值是默认值,您可以这样做:

default_value = 'default pls'
def __init__(self, foo, bar=default_value, ham=default_value):
    self.foo = foo
    if default_value == bar: 
        self.bar = type(self).some_class_variable
    if default_value == ham: 
        self.ham = self.some_function(type(self).some_other_class_variable)

class 名称尚未绑定,因为此时 class 尚未初始化。请参阅此 answer,其中更深入地解释了这一点。

解决这个问题的一种方法是为变量创建 setter 方法,并在实例初始化后设置它们,如下所示:

class Example:

    def __init__(self, foo):
        self.foo = foo
        self.bar = None
        self.ham = None

    def set_bar(self, bar):
        self.bar = bar

    def set_ham(self, ham):
        self.ham = ham

您可以更进一步,使用简单的 if 语句或通过 python 'typing'.

来验证这些属性的类型