访问 class in Python 内的实例变量 3
Accessing instance variables inside a class in Python 3
我在使用 Python 作为 OO 语言时遇到了一些问题。我用 Java 和 Python 学习了 OO,虽然相似,但似乎有一些关键的区别。我正在尝试编写一个基本的聊天机器人(我的意思是非常基本)并且由于某种原因我无法从 class 内部访问变量。这是我的代码:
chatbot.py
import random
class Chatbot:
greetings = ["Hello", "WAZZZZZUUUPPPPP", "Howdy"]
salutations = ["Bye", "Bye Felicia", "Adios", "Fine, I didn't want to talk to you anymore anyway"]
how_are_you = ["I'm good", "I've been better", "Better than you"]
whats_up = ["Not much", "Thinking about life, the universe, and everything", "Just wondering why you're communicating with a human in a box"]
def respond(self,text):
myText = text.lower();
print(text)
if text == "hello":
print(self.greetings[random.randint(0, greetings.length - 1)])
这里是调用代码,rowdy-messenger.py:
from chatbot import Chatbot
print("Welcome to rowdy messenger")
hello = Chatbot()
hello.respond("hello")
我得到的错误文本是(我省略了绝对路径)
...
File "rowdy-messenger.py", line 5, in <module>
hello.respond("hello")
line 15, in respond
print(greetings[random.randint(0, greetings.length - 1)])
NameError: name 'greetings' is not defined
我的问题:
1) 为什么会出现此错误?我习惯了 Java 这样就可以了(当然用这个代替 self)
2) 将它们用作 class 变量或实例变量更好吗?在调用代码中它只会被实例化一次,但我认为对于 "large" 数据最好只实例化一次常量。
问题是您没有始终如一地使用 self
。那一行指的是greetings
两次;第一次使用 self
,但第二次不使用。
Python 的 "explicit is better than implicit" 理念意味着您始终需要使用 self
.
不过请注意,代码可以简化为 print(random.choice(self.greetings))
。
https://syntaxdb.com/ref/python/class-variables
如果您打算让 greeting 成为一个实例变量(看起来是这样),您还需要在 greeting 声明前加上前缀 self
。
这是 python 与 Java 的 OOP 之间的众多差异之一(问候语声明中不需要 this
)
我在使用 Python 作为 OO 语言时遇到了一些问题。我用 Java 和 Python 学习了 OO,虽然相似,但似乎有一些关键的区别。我正在尝试编写一个基本的聊天机器人(我的意思是非常基本)并且由于某种原因我无法从 class 内部访问变量。这是我的代码:
chatbot.py
import random
class Chatbot:
greetings = ["Hello", "WAZZZZZUUUPPPPP", "Howdy"]
salutations = ["Bye", "Bye Felicia", "Adios", "Fine, I didn't want to talk to you anymore anyway"]
how_are_you = ["I'm good", "I've been better", "Better than you"]
whats_up = ["Not much", "Thinking about life, the universe, and everything", "Just wondering why you're communicating with a human in a box"]
def respond(self,text):
myText = text.lower();
print(text)
if text == "hello":
print(self.greetings[random.randint(0, greetings.length - 1)])
这里是调用代码,rowdy-messenger.py:
from chatbot import Chatbot
print("Welcome to rowdy messenger")
hello = Chatbot()
hello.respond("hello")
我得到的错误文本是(我省略了绝对路径)
...
File "rowdy-messenger.py", line 5, in <module>
hello.respond("hello")
line 15, in respond
print(greetings[random.randint(0, greetings.length - 1)])
NameError: name 'greetings' is not defined
我的问题:
1) 为什么会出现此错误?我习惯了 Java 这样就可以了(当然用这个代替 self)
2) 将它们用作 class 变量或实例变量更好吗?在调用代码中它只会被实例化一次,但我认为对于 "large" 数据最好只实例化一次常量。
问题是您没有始终如一地使用 self
。那一行指的是greetings
两次;第一次使用 self
,但第二次不使用。
Python 的 "explicit is better than implicit" 理念意味着您始终需要使用 self
.
不过请注意,代码可以简化为 print(random.choice(self.greetings))
。
https://syntaxdb.com/ref/python/class-variables
如果您打算让 greeting 成为一个实例变量(看起来是这样),您还需要在 greeting 声明前加上前缀 self
。
这是 python 与 Java 的 OOP 之间的众多差异之一(问候语声明中不需要 this
)