我在使用Python作为OO语言时遇到了一些问题。我用Java和Python学习了OO,虽然类似,但似乎有一些关键的区别。我正在尝试编写一个基本的聊天机器人(我的意思是非常基本的),由于某种原因,我无法从类内部访问变量。这是我的代码:
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,这很好(当然使用这个而不是自己)
2)将它们用作类变量或实例变量是否更好?在调用代码中,它只会被实例化一次,但我认为“大”数据最好只实例化常量一次。
答案 0 :(得分:2)
问题在于您没有始终如一地使用self
。该行指的是greetings
两次;第一次使用self
,但第二次没有使用self
。
Python&#34;显式优于隐式&#34;哲学意味着你总是需要使用print(random.choice(self.greetings))
。
但请注意,代码可以简化为strings.Split()
。
答案 1 :(得分:1)
https://syntaxdb.com/ref/python/class-variables
如果您打算将问候语作为实例变量(看起来像你),那么您还希望在问候语声明前加self
前缀。
这是python对OOP和Java之间的许多区别之一(在问候声明中不需要this
)