【发布时间】:2018-08-26 04:02:45
【问题描述】:
我是一个新手 Python 程序员,完全被 OOP 和类中 self 的需要搞糊涂了。我已经阅读了许多试图揭开它的神秘面纱的 SO 帖子、博客* 等,但可以在这种特殊情况下使用一些帮助。
我基于Python2 tutorial on Class and Instance Variables 的以下场景。我会先举我的例子,然后是下面的明确问题。
我先直接设置tricks,然后使用add_trick方法:
class Dog:
tricks = []
def __init__(self, name):
self.name = name
def add_trick(self, trick):
self.tricks.append(trick)
def print_self_tricks(self):
print(self.tricks)
a = Dog('spencer')
b = Dog('rex')
a.tricks = ['foo'] # How is this even possible? Where did I define self.tricks?
a.print_self_tricks()
['foo'] # Ok, the below results make sense
b.print_self_tricks()
[]
a.tricks
['foo']
b.tricks
[]
a.add_trick('jump')
a.print_self_tricks()
['foo', 'jump']
b.print_self_tricks()
[] # Great, as expected
a.tricks
['foo', 'jump']
b.tricks
[] # Great, as expected
现在,完全相同的设置,但以不同的顺序执行:add_trick 在直接设置 trick 之前。
class Dog:
tricks = []
def __init__(self, name):
self.name = name
def add_trick(self, trick):
self.tricks.append(trick)
def print_self_tricks(self):
print(self.tricks)
a = Dog('spencer')
b = Dog('rex')
a.add_trick('jump')
a.print_self_tricks()
['jump']
b.print_self_tricks()
['jump'] # Welp, that's not expected.
a.tricks
['jump']
b.tricks
['jump'] # Welp, that's not expected.
a.tricks = ['foo']
a.print_self_tricks()
['foo']
b.print_self_tricks()
['jump'] # Great, but inconsistent with the behavior above resulting from a.add_trick
a.tricks
['foo']
b.tricks
['jump'] # Great, but inconsistent with the behavior above resulting from a.add_trick
- 为什么 self.tricks 存在?它从未在
__init__中定义(例如 self.tricks = 技巧)。我不希望它可以设置 self.tricks,因为它之前没有定义。 - 为什么我的方法没有得到不同的答案?也就是说,与
a.add_trick('roll over')相比,为什么a.tricks = ['foo']似乎表现得像预期的那样? - 似乎操作顺序很重要。为什么在设置 a.trick 之前调用
add_trick会导致不同的结果?
*这是我目前读到的内容,还有更好的解释吗?
【问题讨论】:
-
“这怎么可能?我在哪里定义了 self.tricks?” - 就在那儿,在那条线上,带着那个任务。
-
# How is this even possible? Where did I define self.tricks?从字面上看就在那一行。但是您会感到困惑,因为您正在使用实例变量来隐藏类级变量。 -
tricks在这种情况下是一个在Dogs 的所有实例之间共享的类变量
标签: python python-3.x class oop instance