这是代码。
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,但我不知道我在做什么,所以这真的没有任何进展。我只需要知道该怎么做以及解释它为什么有效。
你可以做到的。您需要在类中创建一个列表来跟踪实例。
然后您可以在类内的类方法中创建 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)
如果您有一个类变量,它将在该类的所有实例之间共享,然后更改该属性会导致所有实例看到更新后的属性。但实例变量是针对每个单独的实例的,并且它们不共享。
该语言没有内置功能来执行此操作。您需要手动更新每一项。理想情况下,如果它们都存在于容器对象(列表、元组等)之类的地方,您可以在循环中更新它们。该容器可以位于模块中或类命名空间内的任何位置。