在Python 3中访问类中的实例变量

时间:2018-01-26 16:35:15

标签: python instance-variables class-variables

我在使用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)将它们用作类变量或实例变量是否更好?在调用代码中,它只会被实例化一次,但我认为“大”数据最好只实例化常量一次。

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