【问题标题】:How is the initialization of x.a is considered in this code? [duplicate]此代码中如何考虑 x.a 的初始化? [复制]
【发布时间】:2021-04-27 02:26:34
【问题描述】:

这里在类 Node 中没有名为“a”的属性,那么 x.a 的含义是什么?对象名称是否可以包含字符“.”在 python 中?

class Node :
  def __init__(self, left = None, data = None, right = None) :
    self.left = left
    self.data = data
    self.right = right
x = Node(50)
x.a = Node(40)

【问题讨论】:

  • 您完全搞错了允许分配属性的位置。在 Python 中,默认情况下,用户定义类的实例可以接受任何属性

标签: python python-3.x class object attributes


【解决方案1】:

Python 是一种动态类型语言。这意味着您可以设置任何变量的值,而无需声明变量

在您的代码 sn-p 中,x = Node(50) 正在创建一个新的节点类对象,x.left 分配给 50。

现在通过x.a = Node(40),我们只是定义了一个名为a的对象x的新属性,这将是一个left值为50。

如果你这样做 dir(x) 它会给你这样的东西,

['__class__',
 '__delattr__',

  #Some other attributes
 
'__weakref__',
 'a',
 'data',
 'left',
 'right']

如果您查看最后 4 个属性,您会发现 a 现在也被添加为 x 对象的 属性

结论

如果你在new_attribute 不存在于对象中时执行x.new_attribute = Node(10,20,30),那么python 只会在x 对象中创建一个new attribute命名new_attribute 并为其分配Node(10,20,30) 的值。

【讨论】:

  • 好的,我明白了。但是如果我输入 x.a.b = Node(10) 会发生什么。它会被视为 (x.a).b 还是其他?如果我们继续这样做 x.a.b.c.d.e = Node(5) 会发生什么?
  • x.n.m 是可能的,只要 x.n 是一个类对象。如果 x.a.b.c.d 是某个类的对象,则 x.a.b.c.d.e 将起作用。如果父元素是非类对象,这将不起作用,比如说整数。如果 x.p.q = 25 那么 x.p.q.r 将给出错误。
猜你喜欢
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 2010-12-31
  • 2020-06-30
  • 2017-05-25
  • 2011-10-11
  • 2011-12-19
  • 1970-01-01
相关资源
最近更新 更多