如何使用一个命令更改类的所有实例的特定属性

问题描述 投票:0回答:2

这是代码。

class average_person:
    def __init__(self, first_name, last_name, height, weight, email):
        self.height = height
        self.weight = weight
        self.first_name = first_name
        self.last_name = last_name
        self.email = email

        self.email = self.first_name + '.' + self.last_name + email

    def doc(self):
        print(f"Name: {self.first_name + ' ' + self.last_name} Height: {self.height} Weight: {self.weight}, Email: {self.email}")

    def mail(self):
        print(f"Email: {self.email}")

    def change_email(self, gmail):
        self.email = self.first_name + '.' + self.last_name + gmail
        print(self.email)

    


# Create 5 instances of the class

person_1 = average_person("Abu Bakr", "Hassan", "5'6", "122 lbs", '@gmail.com')
person_2 = average_person("Syed", "Jameel", "5'2", "99 lbs", '@cpsaonline.org')
person_3 = average_person("Abdur-Rahman", "Mohammed", "4'10", "100 lbs", '@gmail.com')
person_4 = average_person("Haroon", "Abdul-Mannan", "4'11", "98 lbs", '@company.org')
person_5 = average_person("Bilal", "Ala", "5'1", "101 lbs", '@cpsa.school')

# Running the functions

代码运行良好。我只是不知道如何使用影响类的所有实例的一个单独的命令来更改实例的特定属性或变量(我想更改电子邮件)。

起初我想也许我可以使用@classmethods,但我不知道我在做什么,所以这真的没有任何进展。我只需要知道该怎么做以及解释它为什么有效。

python class
2个回答
2
投票

你可以做到的。您需要在类中创建一个列表来跟踪实例。

然后您可以在类内的类方法中创建 for 循环。

不过,您必须事先定义它。使用类变量来存储共享值,使用类方法来设置和更新所有实例。

你可以这样做。


class AveragePerson:
    shared_email_domain = None
    instances = []

    def __init__(self, first_name, last_name, height, weight, email):
        self.height = height
        self.weight = weight
        self.first_name = first_name
        self.last_name = last_name
        self.email = email

        self.email = self.first_name + '.' + self.last_name + self.email
        AveragePerson.instances.append(self)

    def doc(self):
        print(f"Name: {self.first_name + ' ' + self.last_name} Height: {self.height} Weight: {self.weight}, Email: {self.email}")

    def mail(self):
        print(f"Email: {self.email}")

    @classmethod
    def set_shared_email_domain(cls, domain):
        cls.shared_email_domain = domain

    @classmethod
    def change_all_emails(cls):
        if cls.shared_email_domain:
            for instance in cls.instances:
                instance.email = instance.first_name + '.' + instance.last_name + cls.shared_email_domain
        else:
            print("Shared email domain is not set.")


person_1 = AveragePerson("Abu Bakr", "Hassan", "5'6", "122 lbs", '@gmail.com')
person_2 = AveragePerson("Syed", "Jameel", "5'2", "99 lbs", '@cpsaonline.org')
person_3 = AveragePerson("Abdur-Rahman", "Mohammed", "4'10", "100 lbs", '@gmail.com')
person_4 = AveragePerson("Haroon", "Abdul-Mannan", "4'11", "98 lbs", '@company.org')
person_5 = AveragePerson("Bilal", "Ala", "5'1", "101 lbs", '@cpsa.school')

AveragePerson.set_shared_email_domain("@example.com")

AveragePerson.change_all_emails()


我已经测试过它并且有效。您可以使用此代码运行后打印变量并亲自查看。

for person in [person_1, person_2, person_3, person_4, person_5]:
    print(person.email)

1
投票

如果您有一个类变量,它将在该类的所有实例之间共享,然后更改该属性会导致所有实例看到更新后的属性。但实例变量是针对每个单独的实例的,并且它们不共享。

该语言没有内置功能来执行此操作。您需要手动更新每一项。理想情况下,如果它们都存在于容器对象(列表、元组等)之类的地方,您可以在循环中更新它们。该容器可以位于模块中或类命名空间内的任何位置。

© www.soinside.com 2019 - 2024. All rights reserved.