如何通过另一个类更新/更改一个类初始化参数?

Posted

技术标签:

【中文标题】如何通过另一个类更新/更改一个类初始化参数?【英文标题】:How to update/change one class init arguments by another class? 【发布时间】:2021-04-25 22:33:12 【问题描述】:

我有两个班级,我想分别称它们为 class Aclass B;我需要通过 B 类全局更改 A 类的一些初始值而不制作/返回来自 A 类的任何新对象(B 类不应读取主应用程序变量,也不应从中生成全局变量)。

这是我所做的:

class A:
    def __init__(self):
        self.blah1_is_beautiful = True
        self.blah2_is_beautiful = True
        self.blah3_is_beautiful = True


class B:
    def __init__(self):
        self.null_is_null = None

    def change_some_values(self):
        # Class A instance should update here
        A.blah1_is_beautiful = False
        A.blah2_is_beautiful = False
        A.blah3_is_beautiful = False


obj1 = B()
obj1.change_some_values()
# Some codes ...
new_A_class = A()
print(new_A_class.blah1_is_beautiful)

但我无法得到预期的结果。

注意:我不想在我的主应用程序上从 A 类创建一个对象,或者在 B 类中将其作为全局变量调用并更改其实例; B 类应自行更新 A 类实例,而不使用任何外部变量。

感谢您对此提供任何帮助。

【问题讨论】:

查看您当前的示例。如果调用了 B 类的 change_some_values,您似乎想要更改 A 类的所有实例的值。我理解正确吗? @Hendrik 无论如何,B 类可以在不使用外部变量的情况下更新 A 类实例吗?这是我的问题 @Hendrik;阅读这个场景:A 类和 B 类来自两个不同的模块; B 类自然对主要应用变量一无所知;所以它不能将这些变量称为全局变量。 B 类只知道 A 类名称;只是这个;可以调用它;继承的或任何类型的这些功能 @Hendrik;我想我需要提出新问题。 "只知道A类的名字"所以change_some_values只知道有一个类叫A,却不知道blah123属性的存在?那么它到底在 A 类中更新了什么? 【参考方案1】:

现在,您的 __init__ 方法在每次启动新对象时将属性值设置为 True。 在您的 change_some_values 方法中,您只是更改了 A 类的静态属性,但没有将这些用于任何事情。 像这样的东西可以帮助你。

class A:
    blah1_is_beautiful = True
    blah2_is_beautiful = True
    blah3_is_beautiful = True

    def __init__(self):
        self.blah1_is_beautiful = A.blah1_is_beautiful
        self.blah2_is_beautiful = A.blah2_is_beautiful
        self.blah3_is_beautiful = A.blah3_is_beautiful


class B:
    def __init__(self):
        self.null_is_null = None

    def change_some_values(self):
        A.blah1_is_beautiful = False
        A.blah2_is_beautiful = False
        A.blah3_is_beautiful = False


obj1 = B()
obj1.change_some_values()
obj2 = A()
print(obj2.blah1_is_beautiful)

https://docs.python.org/3/tutorial/classes.html#class-and-instance-variables

【讨论】:

【参考方案2】:

我有点糊涂了,你想改变A类的一个实例,还是类本身?要更改 obj2,此代码对我有用:

class A:
    def __init__(self):
        self.blah1_is_beautiful = True
        self.blah2_is_beautiful = True
        self.blah3_is_beautiful = True


class B:
    def __init__(self):
        self.null_is_null = None

    def change_some_values(self):
        global obj2
        obj2.blah1_is_beautiful = False
        obj2.blah2_is_beautiful = False
        obj2.blah3_is_beautiful = False

obj1 = B()
obj2 = A()
obj1.change_some_values()
print(obj2.blah1_is_beautiful)

在实例化类时注意顺序的变化,否则你会得到一个“obj2 is not defined”的错误。

【讨论】:

【参考方案3】:

您可以在调用函数时添加一个额外的参数,如下所示:

class A:
    def __init__(self):
        self.blah1_is_beautiful = True
        self.blah2_is_beautiful = True
        self.blah3_is_beautiful = True


class B:
    def __init__(self):
        self.null_is_null = None

    def change_some_values(self, name):
        name.blah1_is_beautiful = False
        name.blah2_is_beautiful = False
        name.blah3_is_beautiful = False


obj_a = A()
obj_b = B()
obj_b.change_some_values(obj_a)
print(obj_a.blah1_is_beautiful)

由于 self.blah1_is_beautiful 的值对于类的每个实例都是唯一的,因此您可能希望指定要更改的实例属性。

如果您希望更改 A 类的所有实例的值,只需使用:

class A:
    blah1_is_beautiful = True
    blah2_is_beautiful = True
    blah3_is_beautiful = True
    def __init__(self):
       pass


class B:
    def __init__(self):
        self.null_is_null = None

    def change_some_values(self):
        A.blah1_is_beautiful = False
        A.blah2_is_beautiful = False
        A.blah3_is_beautiful = False


obj_a = A()
obj_b = B()
obj_b.change_some_values()
print(obj_a.blah1_is_beautiful)

【讨论】:

那么你想改变每个类实例的 T/F 值吗? 再次检查我的问题 如果在调用 change_some_values() 之后创建 A 类的新实例,则不会更改您的值,因为在创建 A 的实例时会调用 init 函数班级。我不确定我是否完全理解您想要做什么

以上是关于如何通过另一个类更新/更改一个类初始化参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何初始化作为另一个类的成员变量的基类对象?

是否可以将类类型的对象作为参数传递给另一个类,这样我就不必再次初始化? (Python 3.x)

将方法作为 SEL 参数传递给另一个类方法

成员对象和封闭类

用另一个类成员 C++ 初始化一个类成员

GMM 机器学习聚类算法