【问题标题】:Python Inner Class value assignmentPython内部类赋值
【发布时间】:2020-12-01 23:22:23
【问题描述】:

我在一个类中创建了一个内部类并创建了该类的两个实例,但是当为内部类属性分配不同的值时,它被分配给了两个实例。任何人都可以帮忙吗? 这是代码

class cl1:
    def __init__(self,tagName):
        self.name = tagName
    name1 = 'tagName'
    class cl2:
        name2 = 'name2'

test1 = cl1('test1')
test2 = cl1('test2')
test1.cl2.name2 = "cl1"
test2.cl2.name2 = 'cl2'
print (test1.cl2.name2)

运行时,结果是

cl2

为什么分配的不是“cl1”?

【问题讨论】:

  • 您没有创建cl1.cl2任何 个实例。您只是分配给类变量。你认为内部类像在 Java 中那样工作吗?他们没有。它们在 Python 中并不常用。

标签: python inner-classes


【解决方案1】:

价值:

test1.cl2.name2

是类cl2 的类属性。它与该类相关联,而不与该类的实例相关联。因此,即使您正在通过对 cl1 类的实例的引用来设置该属性的值,因为只有其中一个,所以您设置它的最后一件事会获胜。您的 print 语句正在打印相同的单个值。

谷歌“python 类与实例变量”中关于类和实例变量/属性之间差异的一些好看的文章。

这是一个示例,1) 在您想要的位置提供实例与类属性,以及 2) 将所涉及的类重命名为具有大写名称,因此当您引用实例属性与类属性时很明显。

class Cl1:
    class Cl2:
        def __init__(self, tagName):
            self.name2 = tagName

    def __init__(self, tagName1, tagName2):
        self.name1 = tagName1
        self.cl2 = Cl1.Cl2(tagName2)

test1 = Cl1('test1', 'test2')
test2 = Cl1('test2', 'test2')
test1.cl2.name2 = 'cl1'
test2.cl2.name2 = 'cl2'
print(test1.cl2.name2)

结果:

cl1

请注意,由于您希望内部类的实例与外部类的每个实例相关联,因此内部类的构造函数必须实例化内部类的实例作为创建外部类实例的一部分。

还要注意对self 的引用。实例变量是在类的构造函数(它的 __init__ 函数)中通过在 self 上引用它们来创建的,这是对正在创建的实例的引用。

【讨论】:

  • 能否请您告知如何修改代码,使 cl2 可以成为 cl1 属性的一部分,以便打印输出结果为 cl1?
  • 当然。我马上要说,你应该总是用大写的第一个字母命名类,用小写命名实例和其他变量。它使查看正在发生的事情变得容易得多,然后,您通常会谈论大写名称的类变量和小写名称的实例变量。
  • 我希望我添加到答案中的内容可以为您提供所需的建议。
  • 谢谢。它工作得很好。关键是 "self.cl2 = Cl1.Cl2(tagName2)" 将内部类推迟到外部类。
  • Cl1.Cl2 只是内部类的全称。 Cl1.Cl2(tagName2) 创建该类的一个实例。它被分配给self.cl2,这意味着Cl1 类的每个实例都有一个名为cl2 的实例变量,它引用Cl2 类的一个实例。这就是为什么你可以做test1.cl2.name2,也就是<Cl1 instance><cl1 attribute pointing to a Cl2 instance><name2 attribute of Cl2 instance>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 2013-10-20
  • 2016-11-12
  • 2019-03-20
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多