#python #oop
Вопрос:
Я пытаюсь создать класс со списком полей. См. Код ниже.
class Character: # Private Fields: __age = 18 __weight = 200 __height = 72 def __init__(self, name): self.__name = name @property def get_age(self): return self.__age @property def get_name(self): return self.__name @property def get_weight(self): return self.__weight @property def get_height(self): return self.__height person = Character("someone") print("name =", person.get_name,",", "age =", person.get_age)
Есть ли способ избежать написания свойства @для каждого частного поля, к которому вы хотите получить доступ? Например, есть ли способ передать атрибут в более общую функцию получения, например:
def get_attr(self,attr): #set attr to __attr #return self.attr
Я попытался использовать функцию соединения, но это не сработало
Спасибо за любую помощь
Комментарии:
1. Использовать класс данных?
2. Вы проверили генератор
namedtuple()
классов?3. Можете ли вы… просто получить прямой доступ к полям? Геттеры являются своего рода анти-шаблоном в Python, а свойства предназначены для создания методов, которые выглядят как поля. Просто сделайте поля общедоступными.
4. Это выглядит так, как будто вы пытаетесь написать Java на Python. Попытка инициализировать атрибуты экземпляра на уровне класса, написание геттеров, написание «get» в именах этих геттеров…
5. В Python нет закрытых полей . Это очень важно понять . Обратите внимание, что все ваши
property
s совершенно бессмысленны . Просто удалите их и используйте обычные атрибутыself.name
и т. Д., Инициализированные в__init__
Ответ №1:
Чтобы ответить на заданный вопрос, простое решение состоит в том, чтобы компенсировать искажение имени, которое выполняется с закрытыми членами. например, чтобы получить __age
атрибут, который вы бы использовали: person._Character__age
Но это была бы ужасная идея, и я бы не рекомендовал ее. Если вам нужно, чтобы они были легко доступны, просто удалите подчеркивания. Если им действительно нужно быть личными, они все равно не должны быть легко доступны вне класса, поэтому создание способа сделать их доступными противоречит цели.