如何将列表中的对象分配给变量?

How to assign an object in a list to a variable?

我有一个存储 User 个对象的列表:

profiles_catalog = []

和 'User' 对象:

cont = 1

class User:

    def __init__(self, name, password):
        global cont

        self.registry = cont
        self.name = name
        self.password = password
        self.liked = []
        self.matches = []

        cont += 1

    def __str__(self) -> str:
        return f'Registry: {self.registry}, Name: {self.name}, Password: {self.password}, Liked_list: {self.liked}, matches: {self.matches}'

    def __dict__(self) -> dict:
        return {'Registry': {self.registry}, 'Name': {self.name}, 'password': {self.password}, 'Liked list': {self.liked}, 'matches': {self.matches}}

    @property
    def call_name(self) -> None:
        return self.name

    @property
    def call_password(self) -> None:
        return self.password

    @property
    def call_liked_list(self) -> None:
        return self.liked

    @call_liked_list.setter
    def model_like_profile(self, liked_user) -> None:
        self.liked.append(liked_user)
        return f'{liked_user.name} got liked'

    def see_matches(self) -> None:
        return self.matches

这应该是一个约会应用程序,如 tinder 之类的,它会向用户显示随机个人资料,并且它应该能够喜欢个人资料或继续查看其他个人资料。

为此,我编写了函数 show_random_profile()main_like_profile():

def show_random_profile():

    displayed_user = profiles_catalog[randint(0, len(profiles_catalog) - 1)]
        
    return displayed_user

def main_like_profile(control_user, displayed_user):
    
    liking_user = control_user
    liked_user = displayed_user
    
    liking_user.model_like_profile(liking_user, liked_user)
    print('User liked!')

但我一直收到 TypeError:

Traceback (most recent call last):
  File "c:\Users\Lucas\Documents\LUCAS\programacao\python\meus_projetos\twindder\controller.py", line 140, in <module>
main()
  File "c:\Users\Lucas\Documents\LUCAS\programacao\python\meus_projetos\twindder\controller.py", line 109, in main
main_like_profile(control_user, displayed_user)
  File "c:\Users\Lucas\Documents\LUCAS\programacao\python\meus_projetos\twindder\controller.py", line 34, in main_like_profile
liking_user.model_like_profile(liking_user, liked_user)
TypeError: 'list' object is not callable

在我看来,问题是 list 对象被分配给了一个应该采用 User 的变量,对吗?

如果是这样,我如何分配给 displayed_user 存储在 profiles_catalog 中的随机 User 对象?

或者有什么其他方法可以解决这个问题?

使用您当前的代码,您可以定义 model_like_profile 方法并应用装饰器 @call_liked_list.setter,其中 call_liked_list 是 属性。这使得 model_like_profile 也引用相同的 call_liked_list 属性。所以,行:

liking_user.model_like_profile(liking_user, liked_user)

...相当于liking_user.call_liked_list(liking_user, liked_user),相当于liking_user.liked(liking_user, liked_user)。由于 liking_user.liked 是一个列表,这行代码试图调用一个列表,就好像它是一个函数一样,因此 TypeError.

保持 User class 如您所写,要访问 model_like_profile 中定义的功能,您可以更改为:

liking_user.model_like_profile(liking_user, liked_user)

至:

liking_user.model_like_profile = liked_user

虽然使用 属性 setter 添加到列表通常不是好的做法 - 属性 setter 通常用于分配新值,不添加到列表中。此外,属性 setter 的方法名称最好与 getter 的方法名称相同:

class MyClass:
    def __init__(self):
        self._value = 1

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, value):
        self._value = value