Я пытаюсь скомпоновать некоторый пример кода, и я столкнулся с чем-то, что для меня не имело смысла. Не включая весь источник, я постараюсь настроить таргетинг на то, что я считаю важными разделами, и, надеюсь, я получу все это.Подкласс Dict, Переменные класса
Здесь он объявляет пользовательский подкласск подкласса, с тем, что, как я думал, должно быть «клиентом» и «фильмом» переменных переменных. (Как, установив их из одного класса, необходимо обновить их во всех случаях, да?)
class Payment(dict):
customer = film = None
А вот где он использует Оплата ...
columns = [item[0] for item in cursor.description]
payments = []
for row in cursor.fetchall():
payment = Payment(zip(columns, row)) #I believe this is where he loads dict items
payment.customer = customers[payment["customer_id"]] #This is where he assigns 'class variable'
payment.film = films[payment["film_id"]]
payments.append(payment)
В окончательном списке, не должны ли все «платежи» иметь одинаковые значения (которые, как оказалось, являются еще одним типом)? Вот где мое замешательство.
Оказалось, что эти два атрибута имеют уникальные значения по всей доске. Это связано с подклассом Dict? Скопированы ли значения, а не ссылки (так что технически они являются переменными класса, но поскольку они скопированы, они по-прежнему остаются уникальными).
Просто, когда я думал, что я понял простую механику OO, это бросает меня ...
Я видел эту технику, используемую в случаях, когда создание экземпляра не всегда инициализирует все атрибуты экземпляра. В этом случае это может быть полезным способом присвоить значение по умолчанию атрибуту экземпляра, который может или не может быть инициализирован в экземпляре. «Пирамида» использует этот стиль довольно много. – Duncan
Ответ NPE помог, но этот лучший иллюстрированный поиск атрибутов. Я думаю, я был в замешательстве, потому что обычно мой доступ к переменной переменной класса из экземпляра обычно доступен только для чтения. Я только пишу переменную класса из staticmethod. – user2097818
Если бы я хотел рассматривать «foo» (как в вашем примере) как переменную класса явно из моего экземпляра, мне нужно будет использовать C.foo из моих методов экземпляра? (предположим, что переменная является целым числом) – user2097818