gpt4 book ai didi

python - 将每个对象作为 self 对象返回的方法

转载 作者:行者123 更新时间:2023-12-01 03:58:05 24 4
gpt4 key购买 nike

我在使用 Python 中的列表时遇到问题。我希望我的 Category 有一个方法可以返回数据库中的所有类别。这是我的代码

class Category(Database)::

# other methods here

def find_by_id(self, id_to_find ):
sql_command = "SELECT * FROM categories WHERE id = :id LIMIT 1"
self.cursor.execute( sql_command , data )
return self.is_data_exists( self.cursor )

# to check if cursor have at less one row
def is_data_exists(self , cursor):
result = cursor.fetchone()
if result is None:
return False
else:
# if data exists, we set the object with values
self.id = data[0]
self.name = data[1]
return self


def all(self):
all_item = []
self.cursor.execute( "SELECT id FROM categories" )

for row in self.cursor.fetchall() :
item = self.find_by_id(row[0])
print( item.describe() )
# problem here
all_item.append(item)

return all_item



Category().add("WEB")
Category().add("PYT")
Category().add("TEST")
Category().add("HELL")


for category in Category().all():
print(category.describe())

所以print( item.describe() ) 返回:

Category #1 named *TEST*
Category #2 named *WEB*
Category #3 named *PYT*
Category #4 named *HELL*

但是Category().all()返回:

Category #4 named *HELL*
Category #4 named *HELL*
Category #4 named *HELL*
Category #4 named *HELL*

出了什么问题?看起来就像数组中的 self 对象更改...

最佳答案

那么,让我们来分解一下:

  • is_data_exists 在设置一些成员变量后返回对 self 的引用。
  • find_by_id 返回 is_data_exists 返回的引用,因此也是对 self 的引用。

然后:

item = self.find_by_id(row[0])

由于返回值的方式,这相当于item = self。因此,all_item.append(item) 将对 self 的引用附加到您的 all_item 列表中。

所以你的列表实际上是[self, self, self, self]

问题的根源有点远。你有结构性问题。您定义:

class Category(Database):

但是,继承一个类意味着“X是Y”。在这里,您说“类别是数据库”。

但是Category不是数据库,所以这本质上是错误的。如果您需要一些常用方法,Category 应该只是一个对象,或者可能是一个Record。然后,对于数据库返回的每一行,您将实例化一个 Category 并将其添加到列表中。

但无论如何,除非您将此作为练习,否则请使用适当的数据库抽象模块(例如 SQL alchemy),它将节省您大量的时间。

关于python - 将每个对象作为 self 对象返回的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37099384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com