【问题标题】:How to reference a variable inside a class method?如何在类方法中引用变量?
【发布时间】:2017-08-09 01:47:59
【问题描述】:

希望有人可以帮助我尝试打印类方法的变量。如我的代码中所示,我想打印方法“on_status”的变量 A,它是我的类 MyStreamListener 的一部分。这可能吗?有点菜鸟问题...欣赏任何见解。谢谢!

Y = 0
class MyStreamListener(tweepy.StreamListener):

    def __init__(self, api=None, **options):
        self.api = api
        self.retry_time_start = options.get("retry_time", 5.0)
        self.retry_420_start = options.get("retry_420", 60.0)

    def on_connect(self):
        pass

    def on_status(self, status):
        X = '@' + status.user.screen_name + ' - ' + status.text
        if not any(badword in X for badword in badwords):
            print(X)
            print(status.created_at)
            self.A = status.user.screen_name



    def on_error(self, status_code):
        if status_code == 420:
            Y = 1


myStreamListener = MyStreamListener()
myStream = tweepy.Stream(auth = api.auth, listener=myStreamListener)
# async parameter on filter will allow stream to run on a new thread when connection is closed and old thread is blocked
while True:

    if Y != 1:
        print(myStream.filter(track=['test'], async = True))
        --- WANT TO PRINT VARIABLE A HERE ---

【问题讨论】:

  • 假设on_status已经被调用,那么就执行print(myStream.A)
  • 方法可能没有被执行,所以变量不存在。当方法内部的条件不满足时也是如此。
  • 这是一个简单的实例方法,而不是classmethod
  • 注意:on_error() 中的Y = 1 不会在没有global 声明的情况下更改全局Y,因此Y 永远不会等于1。但是,我建议不要使用 global 并且也将 Y 设为实例变量。最佳做法是在 __init__() 中初始化变量。
  • 感谢大家的帮助和反馈!

标签: python python-3.x class methods


【解决方案1】:

首先,你不应该将你的类的普通方法描述为“类方法”。在 Python 中,“类方法”是在类上调用的方法,而不是在类的对象上调用的方法。此类方法使用@classmethod decorator 定义,并将类(按约定命名为cls)而不是对象(按约定命名为self)作为它们的第一个参数。 (因此MyStreamListener 类方法可以称为MyStreamListener.my_class_method()myStreamListener.my_class_method(),其中myStreamListenerMyStreamListener 类型的对象。)

其次,如果您在方法中分配变量self.A,则该变量属于对象,而不是方法,并且可以在对象可用的任何地方访问,如object_var.A,其中object_var是持有对象的变量。如果你在一个方法中,那么你会使用self.A。如果您的客户端代码刚刚将您的类实例化为myStreamListener,那么您将使用myStreamListener.A

第三,如果你要从on_status外部访问A,它可能还没有被初始化,你应该用__init__中的一些合理的值来初始化它。

【讨论】:

  • 非常感谢您的批评和反馈,非常感谢。
  • 这里唯一的问题是我使用的 tweepy API 从 on_status 方法中获取了我的变量 A。我不知道如何在 init 中初始化
  • 例如,您可以在 __init__ 中使用 self.A = None 进行初始化,这意味着在写入之前尝试读取 A 将返回 None,而不是引发AttributeError 异常。如果您尝试打印A,而on_status 仅使用包含badwords 中的任何内容的status 调用,您会期待什么行为? (即,当 A 尚未设置时。)这将决定您应该如何处理未初始化的 A 的可能性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 2020-04-15
  • 2011-01-12
相关资源
最近更新 更多