访问 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