首页 > 解决方案 > 对 __init__ 的使用感到困惑

问题描述

我创建了一个从 YouTube API 创建的类。它看起来像这样:

class YouTube:

  def __init__(self,name,version,developerKey):
        self.service=build(name, version, developerKey)

  def get_video_info(self,vid_id):
    vid_request = self.service.videos().list(
    part = 'snippet,statistics',
    id = vid_id,
    fields = 'items(kind,id,statistics)')

    vid_response = vid_request.execute()
    return vid_response

if __name__ == "__main__":    
    name = 'youtube'
    version = 'v3'
    api_token='xxxx'
    query=YouTube(name,version,api_token)

    vid_id='YYYYY_VID_ID'
    response = query.get_video_info(vid_id)

    pprint(response)

它工作正常,但后来我在init方法上尝试了以下操作:

def __init__(self):
    self.name = 'youtube'
    self.version = 'v3'
    self.developerKey = 'xxxxxxx'
    self.service = build(self.name, self.version,self.developerKey)


if __name__ == "__main__":    
     query = YouTube()
     response = query.get_video_info(vid_id)

     pprint(response)

我收到以下错误:

def get_video_info(self,vid_id):
    vid_request = self.service.videos().list(
    part = 'snippet,statistics',
    id=vid_id,
    fields= 'items(kind,id,statistics)')

    Exception has occurred: AttributeError 'str' object has no attribute 'request'

    vid_response = vid_request.execute()

我在网上搜索,我看到这个异常发生在各种情况下,我感到很失落?有人可以指出我应该搜索的方向吗?

标签: python-3.xyoutube-api

解决方案


根据此文档,这build是定义函数的方式:

build(serviceName, version, http=None, discoveryServiceUrl=DISCOVERY_URI, developerKey=None, model=None, requestBuilder=HttpRequest, credentials=None, cache_discovery=True, cache=None, client_options=None, adc_cert_path=None, adc_key_path=None, num_retries=1)

构造一个用于与 API 交互的资源。

因此,您应该在第二个代码段中将开发人员密钥作为关键字参数传递:

self.service = build(
    self.name,
    self.version, 
    developerKey = self.developerKey
)

推荐阅读