Python Node类无a属性时x.a初始化及对象名含.的问题解析
相关代码
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)
问题1:x.a的初始化逻辑是如何定义的?
这里的x.a根本没有走类层面预先定义的初始化流程。Python是动态类型语言,允许在实例创建后直接给实例追加属性:当代码执行到x.a = Node(40)这一行时,解释器会直接在x指向的Node实例的内部属性存储结构(也就是实例的__dict__字典)中,新增一个键为a的条目,把新建的Node(40)实例作为对应的值存进去,整个过程完全不需要提前在类的定义里声明要存在a这个属性。
顺带提个代码本身的小问题:Node类的__init__参数顺序是(left, data, right),写x = Node(50)其实是把50传给了left位置参数,实际初始化出来的x是left=50、data=None、right=None,和常见二叉树节点把第一个参数当数据的预期逻辑是错配的。
问题2:Node类并未定义名为a的属性,此处的x.a代表什么含义?
x.a是仅绑定在x这一个特定实例上的动态自定义属性,和Node类本身设计的left、data、right三个属性没有任何逻辑关联:
- 这个属性不会在Node类的其他实例上存在,比如你再新建一个节点
y = Node(),直接访问y.a会直接抛出属性不存在的错误 - 这个属性是独立于类设计的附加内容,后续你给x加的任何属性(比如x.b、x.c)都是同理,只要给实例赋值一次就会存在,类本身不会有任何感知。
问题3:Python中的对象名是否可以包含「.」字符?
Python的合法标识符(也就是日常使用的变量名、对象名)完全不允许包含点号字符:
- 点号是Python语法里固定的属性访问运算符,天生就是用来分隔“要操作的目标对象”和“要访问/赋值的对象属性”的
- 如果尝试写出
my.obj = 123这样的代码,解释器根本不会把my.obj当成一个完整的对象名,而是会直接解析成“找到名为my的对象,给它的obj属性赋值为123”的逻辑,完全和你想把点号嵌进对象名的预期不一样。
内容的提问来源于stack exchange,提问作者VIMALAN S S
相关产品推荐
相关产品推荐

