Предположим, у меня есть класс:
class Car(object):
def __init__(self, name, tank_size=10, mpg=30):
self.name = name
self.tank_size = tank_size
self.mpg = mpg
Я собрал список автомобилей, на которые смотрю:
cars = []
cars.append(Car("Toyota", 11, 29))
cars.append(Car("Ford", 15, 12))
cars.append(Car("Honda", 12, 25))
Если я назначу имя своему любимому в данный момент(«указатель» в список, если хотите):
my_current_fav = cars[1]
Я могу легко получить доступ к атрибутам моего текущего фаворита:
my_current_fav.name # Returns "Ford"
my_current_fav.tank_size # Returns 15
my_current_fav.mpg # Returns 12
Здесь я начинаю затуманиваться.Я хотел бы предоставить дополнительные «вычисляемые» атрибуты только для моего текущего фаворита (давайте предположим, что эти атрибуты слишком «дороги» для хранения в исходном списке и их проще просто вычислить):
my_current_fav.range # Would return tank_size * mpg = 180
# (if pointing to "Ford")
В моемВ этом случае я просто капитулировал и добавил «диапазон» как атрибут Car ().Но что, если хранить 'range' в каждом экземпляре Car () было дорого, но вычислять его было дешево?
Я подумал о том, чтобы сделать my_current_fav подклассом Car (), но я не мог понятьспособ сделать это и по-прежнему поддерживать мою способность просто "указывать" my_current_favorite на запись в списке "cars".
Я также рассматривал возможность использования декораторов для вычисления и возврата 'range', но не смогнайти способ также предоставить доступ к атрибутам «имя», «mpg» и т. д.
Существует ли элегантный способ указать на любой элемент в списке «автомобили», предоставить доступ к атрибутамна указанный экземпляр, а также для предоставления дополнительных атрибутов, не найденных в классе Car?
Дополнительная информация:
После прочтения многих ваших ответов я вижу, что есть справочная информация.должен был поставить в исходный вопрос.Вместо того, чтобы комментировать многие ответы по отдельности, я добавлю здесь дополнительную информацию.
Этот вопрос является упрощением более сложной проблемы.Первоначальная проблема заключается в модификации существующей библиотеки.Несмотря на то, что использование диапазона является вызовом метода, а не атрибута, это хороший способ, но изменение
some_var = my_current_favorite.range
на
some_var = my_current_favorite.range()
во многих существующих пользовательских сценариях будет дорогостоящим.Черт возьми, отслеживание этих пользовательских сценариев будет дорого.
Аналогично, мой нынешний подход к вычислительной дальности для каждого автомобиля не является "дорогим" с точки зрения Python, но - это дорого во время выполнения, потому что для реального аналога требуются медленные вызовы (встроенной) ОС.Хотя сам Python не медленный, эти вызовы, поэтому я стараюсь свести их к минимуму.