Форум сайта python.su
Добрый день.
Минимальный пример для понимания:
class Server:
def __init__(self, name):
if какое-то условие:
self.property = value0
else:
self.property = value1
Офлайн
EmattenДа как бы в двух словах не расскажешь.
Правильно ли с точки зрения pythonic way и в принципе читаемости кода и подводных камней так делать? Или есть какие-то другие варианты (например, разные классы для разных условий и т.д).
EmattenДа класс-то инициализировать нельзя. Инициализировать можно экземпляр класса только. А класс - это множество объектов, у которых совпадает структура, поведение и семантика. Между объектами - одни взаимодействия, между классами - другие отношения.
Как правильно инициализировать класс
EmattenНе, ты создаёшь один класс Server, потом инстанциируешь объект этого класса. И когда объект создался, ты в него подаёшь снаружи данные для инициализации значений свойств. Когда значения свойств объекта меняются, объект переходит в другое состояние. Соответственно, тебе нужно представить и описать всё множество состояний объекта. Одно состояние объекта образуется из всех значений всех свойств объекта в один момент времени.
Или есть какие-то другие варианты (например, разные классы для разных условий и т.д).
Офлайн
Спасибо за пояснения. В терминологии разбираюсь достаточно, написал неправильно, согласен. Инициализация объекта класса правильно.
Я говорю о других случаях. Понятно, что нет смысла заводить два отдельных класса “Собака” и “Черная собака”, потому что второй класс будет дублировать первый. Для этого можем ввести свойство объекта “цвет собаки”. У меня немного другая ситуация. Допустим у меня есть необходимость инициализировать два объекта класса “Собака”, при этом первый - новая собака, а вторая - собака, свойства которой уже были описаны и занесены в базу данных. Для инициализации второго объекта мне нужно будет дергать БД. В этом случае есть ли смысл использовать два класса “Новая собака” и “Знакомая собака” или достаточно все описать в одном классе? Я спрашиваю с т. з. целесообразности, читаемости и прозрачности кода.
Офлайн
первый класс Собака у тебя будет родительский, второй класс ЗнакомаяСобака ты будешь наследовать от Собаки, а третий класс ЗнакомаяСобакаТерьер будешь наследовать от ЗнакомойСобаки со всеми ее свойствами.
Офлайн
Я представляю Класс как некий шаблон или матрица, отдельное пространство.
Атрибуты класса типа
self.variable_1 = какие-то данные
self.variable_2 = еще какие-то данные
class Display: def __init__(self, background, width): self.background = background self.width = width self.current_message = ''
disp_1 = Display('black', 5) disp_2 = Display('blue', 10)
class Display: def __init__(self, background, width): self.background = background self.width = width self.current_message = '' def message_display(self, text): self.current_message = text print(f'на дисплей шириной {self.width} вывелся текст {text}, цвет фона {self.background}') def get_current_message(self): return self.current_message def main(): disp_1 = Display('black', 5) disp_2 = Display('blue', 10) for d in disp_1, disp_2: d.message_display('HELLO') if __name__ == '__main__': main()
на дисплей шириной 5 вывелся текст HELLO, цвет фона black
на дисплей шириной 10 вывелся текст HELLO, цвет фона blue
Офлайн
EmattenНельзя просто так, по названиям, сказать, что такие-то классы нужны, а такие-то классы не нужны. Даже если эти названия очень похожи и кажутся логически связанными как-то. Это не показатель.
Понятно, что нет смысла заводить два отдельных класса “Собака” и “Черная собака”, потому что второй класс будет дублировать первый.
EmattenА если у собаки несколько цветов сразу? Это всё не так просто. Хочется, конечно, уложить всё в простые модели, как в жизни - всё легко и просто. Но в мире программ это всё не так устроено. Поэтому не торопись создавать свойство, если тебе показалось, что оно очень логично. Оно может вылезти потом боком. Сначала надо всё хорошенько обдумать. Может, не один раз.
Для этого можем ввести свойство объекта “цвет собаки”.
EmattenНе, у тебя один класс Собаки, а у этого класса есть операция заполнения объекта Собака данными. И вот туда надо подать данные или сразу, или взяв их из базы данных. Так что объект Собака не будет знать о существовании базы данных какой-то там в соответствии с законом Деметры. Если объект Собака не знает, откуда появились данные в нём, - это хорошо. Если объект Собака знает, откуда появились данные в нём, - это плохо. Плохо это потому, что эта информация бесполезна для этого объекта, а при этом внедрить туда что-то другое вместо базы данных будет сложно, потому что у тебя все Собаки, Кошки и Лошади будут знать про эту базу данных и их придётся всех переделывать капитально, чтобы они про неё знать перестали. Закон Деметры защищает от всей этой возни, поэтому его надо соблюдать везде и во всём. Звучит он так: меньше знаешь - крепче спишь.
Допустим у меня есть необходимость инициализировать два объекта класса “Собака”, при этом первый - новая собака, а вторая - собака, свойства которой уже были описаны и занесены в базу данных. Для инициализации второго объекта мне нужно будет дергать БД. В этом случае есть ли смысл использовать два класса “Новая собака” и “Знакомая собака” или достаточно все описать в одном классе?
Отредактировано py.user.next (Май 3, 2023 07:30:22)
Офлайн