使用For循环创建对象

时间:2019-12-04 17:25:17

标签: python list loops object variables

首先,我很抱歉,因为我不太确定如何在Python语法中写出该查询的字词。我今天刚开始学习它,它主要来自基于PowerShell的背景。

我目前正在尝试获取Google Cloud中我们组织内的项目列表。我想在两列中显示此信息:项目名称和项目编号-本质上是一个对象。然后,我希望能够查询该对象,说:项目名称为“ X”的地方,请给我项目编号。

但是,我相当难以创建所述对象。我的代码如下:

import os
from pprint import pprint
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials

credentials = GoogleCredentials.get_application_default()
service = discovery.build('cloudresourcemanager', 'v1', credentials=credentials)

request = service.projects().list()
response = request.execute()
projects = response.get('projects')

然后,“ projects”变量似乎是一个列表,而不是我可以浏览并对其运行查询的对象。我已经尝试运行以下内容:

pprint(projects.name)
projects.get('name')

两者均返回错误: “ AttributeError:“列表”对象没有属性“名称””

我也考虑在For循环中创建一个类,这几乎给了我想要的东西,但是一次只显示一个项目名称和项目编号,而不是我可以查询的整个集合:

projects=[]
for project in response.get('projects', []):
    class ProjectClass:
        name = project['name']
        projectNumber = project['projectNumber']
    projects.append(ProjectClass.name)
    projects.append(ProjectClass.projectNumber)

我想如果我将每个类都存储在列表中可能会起作用,但是可惜,没有这种快乐!也许我需要在类变量中包含For循环?

任何帮助,将不胜感激!

1 个答案:

答案 0 :(得分:1)

正如@ Code-Apprentice在评论中提到的那样,我认为您缺少对面向对象编程的关键理解,即类与对象之间的区别。将类视为创建对象的“蓝图”。即您的类ProjectClass告诉python ProjectClass类型的对象将具有两个字段,即name和projectNumber。但是,ProjectClass本身只是一个蓝图,而不是一个对象。然后,您需要创建一个ProjectClass实例,您将这样做:

project_class_1 = ProjectClass()

太好了,现在您有了一个ProjectClass类型的对象,它将具有名称和projectNumber字段,您可以像这样引用它们:

project_class_1.name
project_class_1.projectNumber

但是,您会注意到,您创建的类的所有实例的name和projectNumber都具有相同的值,但这样做不会!创建每个实例时,我们需要能够指定值。输入 init (),这是一种特殊的python方法,俗称“构造函数”。当我们如上所述创建类的新实例时,此函数会由python自动调用,并负责设置该类的所有字段。类和对象的另一个强大功能是可以定义可以随意调用的不同函数的集合。

class ProjectClass:
    def __init__(self, name, projectNumber):
        self.name = name
        self.projectNumber = projectNumber

好多了。但是等等,那自变量是什么?好了,就像我们能够通过“ project_class_1”变量名引用实例的字段之前一样,我们需要一种在运行属于该实例一部分的函数时访问实例的字段的方法,对吗?输入自我。 Self是另一个python内置参数,其中包含对正在访问的ProjectClass当前实例的引用。这样,我们可以在将保留的类的实例上设置字段,但不会被其他ProjectClass实例共享或覆盖。重要的是要记住,传递给类上定义的任何函数的第一个参数始终是self(除了某些不需要立即担心的边缘情况)。

因此,重组代码,您将得到以下内容:

class ProjectClass:
    def __init__(self, name, projectNumber):
        self.name = name
        self.projectNumber = projectNumber

projects = []
for project in response.get('projects', []):
    projects.append(ProjectClass(project["name"], project["projectNumber"])

希望我已经很好地解释了这一点,并为您提供了有关所有这些部分如何组合在一起的完整答案。希望您能够自己编写该代码,而不仅仅是给您答案!