#python #tkinter #python-dataclasses
#python #tkinter #python-классы данных
Вопрос:
Я создаю проект Python Tkinter MVC с использованием классов данных, и я хотел бы создавать виджеты путем перебора словаря, созданного методом asdict (при передаче в представление через контроллер); однако есть атрибуты, которые я не хочу включать в набор виджетов. Перед этим редактированием я опубликовал нечто похожее на приведенный ниже класс (теперь это более специфично для проекта, над которым я работаю, спасибо @Prune, @Cameron_McFee и @Brian_McCutchon за их ответы). Есть ли способ исключить атрибуты из метода asdict? В приведенном ниже примере я не хочу включать «customer» в словарь.
Я попытался экспериментально включить две спецификации полей — repr=False и init=False для двух полей, но я предположил, что они не будут работать, и они этого не делают.
@dataclass
class Product:
name: str
description: str = field(repr=False)
N: float = field(init=False, default=0.0)
P: float
K: float
_customer = None #class variable until assigned
self._customer # but 'self' doesn't exist in this context.
@property
def customer(self):
return self._customer
@customer.setter
def customer(self, value):
self._customer = value
Я понимаю, что существуют разные способы построения класса для достижения этой цели, возможно, избегая классов данных, например:
class Product:
def __init__(self, name: str, description: str, N: float, P: float, K: float):
self.name = name
self.description = description
self.N = N
self.P = P
self.K = K
self._customer = None
@property
def customer(self):
return self._customer
@customer.setter
def customer(self, value):
self._customer = value
Это включает в себя больше шаблонов, которых я хотел бы избежать, если это возможно. Несовершенной аналогией была бы модель на C #, экземпляр которой можно создать с помощью Dapper или EF.
Комментарии:
1. Почему вы спрашиваете нас, действительно ли это? Вы должны знать , прежде чем публиковать, поскольку это проверяемый элемент и, следовательно, выходит за рамки переполнения стека. «Pythonic» является самоуверенным, а также не по теме, если вы не можете указать на конкретную технику и объяснить свои опасения по этому поводу. В противном случае вы запрашиваете проверку кода — не на том сайте.
Ответ №1:
Из PEP 557:
Декоратор dataclass проверяет класс на поиск полей. Поле определяется как любая переменная, указанная в аннотациях. То есть переменная, имеющая аннотацию типа. За двумя исключениями, описанными ниже, ни один из механизмов класса данных не проверяет тип, указанный в аннотации.
Таким образом, это допустимый код python, но _dib
переменная класса (или свойство dib) не будет включена в сгенерированные сравнительные методы, как _dib
это не __annotations__
Комментарии:
1. Я думаю, что есть еще одна проблема:
_dib
в этом случае не будет переменной класса? Вероятно, это не то, чего хочет OP.2. конечно, это тоже проблематично — но получатель должен возвращать переменную класса None, пока установщик не применит переменную экземпляра вместо нее, верно? Значит, он будет работать как переменная экземпляра с значением по умолчанию?