в игре Ren'Py я кодирую, я пытаюсь оптимизировать свой код и застрял в поиске способа сбросить одно и то же значение для всех экземпляров одного и того же класса.
Вот мой код:
init python:
class Girl():
def __init__(self,name,age):
self.name = name
self.age = age
self.place = "Nowhere"
self.appear = False
Bree = Girl("Bree",26)
Sasha = Girl("Sasha",27)
label reset_appear():
Bree.appear = False
Sasha.appear = False
На данный момент у меня есть только несколько экземпляров этого класса, но я планирую добавить еще около 50, и я хотел исправить это, прежде чем продолжить.
Я подумал о том, чтобы сделать что-то вроде этого (еще будучи в классе):
def reset_appear(self):
self.appear = False
Но вам все равно нужно будет вызывать его для каждого экземпляра. Я тоже думал об этой функции вне класса, но не знаю, как ее кодировать.
Вы можете использовать атрибут класса для хранения всех экземпляров и метод класса чтобы перебрать все экземпляры:
class Girl:
_instances = []
def __init__(self, name, age):
self.name = name
self.age = age
self.place = "Nowhere"
self.appear = False
self._instances.append(self)
@classmethod
def reset_appear(cls):
for instance in cls._instances:
instance.appear = False
def __repr__(self):
# added for sake of example
return '{} {}'.format(self.name, self.appear)
Bree = Girl("Bree", 26)
Bree.appear = True
Sasha = Girl("Sasha", 27)
Girl.reset_appear()
print(Girl._instances)
# [Bree False, Sasha False]
Спасибо за ответ, но поскольку я новичок в Python, я еще не знаком с @classmethod; повтор; (cls); и .format Сравнивая ваш ответ с ответом @ Graipher, я думаю: разве это не «почти» тот же метод, который он перечислил? Мне нужно больше поработать над этой концепцией, чтобы лучше понять :)
Я не знаком с Ren'Py, поэтому мои примеры написаны на обычном Python.
Вам нужно где-то собрать все экземпляры класса Girl
.
Это может быть простой список:
class Girl():
def __init__(self,name,age):
self.name = name
self.age = age
self.place = "Nowhere"
self.appear = False
Bree = Girl("Bree", 26)
Sasha = Girl("Sasha", 27)
girls = [Bree, Sasha]
for girl in girls:
girl.appear = False
Или вы можете попросить класс обработать это:
class Girl():
instances = []
def __init__(self,name,age):
Girl.instances.append(self)
self.name = name
self.age = age
self.place = "Nowhere"
self.appear = False
for girl in Girl.instances:
girl.appear = False
Ren'Py может использовать код Python в любое время, просто используя «init python» или «python» (для вызовов), поэтому я использую Python :) В любом случае, ваш второй метод самый простой и отлично работает. Большое спасибо ! Ваш первый метод выглядит великолепно, но поскольку мне потребуется добавить более 50 девушек, было бы ошибкой использовать ручной метод для создания списка. Видите ли, я стараюсь сделать свой код более автоматическим, чтобы упростить его для будущих разработок :) (сначала я даже не использовал систему классов, и мне нравится 20 параметров для этого класса, так что это было полный бардак ^^)
Добавленный
classmethod
хорош.