属性是另一个类时的类属性继承' python中的属性

时间:2016-09-08 17:16:33

标签: python class inheritance properties

我有一个班级:

class a():
    def __init__(self):
        self.x = ["a", "b"]

和另一个班级:

class b():
    def __init__(self, r):
        self.y = r
    def chg(self, a):
        self.y = a

我做:

>>> m = a()
>>> m.x
["a", "b"]
>>> n = b(m.x)
>>> n.y
["a", "b"]
>>> n.y = ["c", "d"]
>>> n.y
["c", "d"]
>>> m.x
["a", "b"]

现在为什么没有m.x更改为["c", "d"]?我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

继承在Python中不起作用。但是,我认为你的问题是可变性而不是继承本身。 (你没有申请继承,我说这些是因为你用它作为标签和标题。)

试试这样。

class a():
    def __init__(self):
        self.x = [5]

class b():
    def __init__(self, r):
        self.y = r
    def chg(self, a):
        self.y = a

m = a()
n = b(m.x)
n.y[0] = 99
print m.x
# Gives 99

这样,您只创建一个列表,并将其与两个不同的类一起使用。

注意:您可以将此视为C类语言中按参考传递属性。

请记住,Python中的每个任务都是通过引用传递,因为Python处理的变量与这些语言不同。 Read more about it.(这不会影响可变性。)

编辑:我看到你编辑了你的问题。现在让我解释为什么你的代码不能按预期工作。

可变性意味着您可以更改容器内的元素,而无需将其分配给内存中的新地址。

当你这样做时,

n.y = ["c", "d"]

您不更改列表,(因此您不 mutate 列表)您只需为该变量名称指定一个新列表。要更改原始列表,必须使用list[index]更改每个元素,因此元素将被更改,但列表将是相同的列表。所以你可以这样做

m = a()
n = b(m.x)

new_list = ["c", "d"]

for i, elem in enumerate(new_list):
    # This way you change every element one-by-one.
    n.y[i] = elem

print m.x

如果您不熟悉enumerate,请立即进行研究。但是如果你想使用更简单的代码(更类似于C实现。)你可以像这样进行分配,

for i in range(len(new_list)):
    n.y[i] = new_list[i]

答案 1 :(得分:1)

Oke所以你需要做一些关于内存如何在python中工作的内容。你在这做什么:

>>> n = b(m.x)
>>> n.y
5

要求将值m.x发送给n的构造函数。此时m.x的值为5,因此将5传递给构造函数,然后构造函数将对象中的NUMBER 5而不是内存地址保存到变量m.x.意味着n无论如何都与m无关。因此,如果您更新m.x的位置,则n将保持不变,因为m的数据存储在与n完全不同的位置。

在像C这样的语言中,您可以将变量的地址传递给构造函数,但这在Python中是不可能的。 python中使用地址的唯一变量是array' s。因此,如果您确实需要此功能,可能需要考虑使用单个元素数组。

我会给你的另一个提示是给你的类和变量专有名称而不只是单个字符名称!