@KripoZ

Как не писать каждый раз название класса перед переменной в Python?

Ключевое слово With - удобство, обеспеченное Delphi для того, чтобы сослаться на элементы сложной переменной, типа записи или объекта.

Это упрощает код, удаляя потребность в префиксе для каждого упомянутого элемента переменной со сложным именем.

Например:

myObject.colour:= clRed;
myObject.size:= 23.5;
myObject.name:= 'Fred';

может быть перезаписан:

With myObject do
begin
 colour:= clRed;
 size:= 23.5;
 name:= 'Fred';
end;


Какой аналог With в Python?
  • Вопрос задан
  • 125 просмотров
Пригласить эксперта
Ответы на вопрос 3
@bacon
1. начнем с того, что ты не пишешь название класса, ты пишешь название объекта
2. хотелка очень сомнительная, обычно такое делает __init__
3. домашнее задание - напиши метод который по словарю {'colour' : 'clRed', 'size': 23.5, 'name': 'Fred'} присвоит значения
Ответ написан
Комментировать
Vindicar
@Vindicar
Я бы сказал, паскалевский with оказывается даже более многословен, чем код без него.
А учитывая, что Питон не позволяет даже опускать self, т.е. требует явно писать self.attribute и self.method() вместо attribute и method(), можно догадаться, что такого там точно нет.

Если тебе требуется записать ну очень много атрибутов - закинь их в словарь, и используй цикл + setattr().
Но вообще, если у тебя так много атрибутов, это обычно означает плохое проектирование программы.
Ответ написан
Комментировать
@SteamStyx
есть такой принцип - явное, лучше неявного, помоему это правильно, что нужно указывать объект.
по поводу кода - есть концепт, контекстной работы с объектами через декораторы и контекстные менеджеры:

вот декоратор:

class A: pass
# объект, на который навешиваются аттрибуты
some_A_inst = A()

# это декоратор
def arg_space(obj):
    def setter(fnc):
        args = fnc()
        for n,v in args.items():
            setattr(obj,n,v)
    return setter

# функция, все ее внутренние переменные отправятся в декоратор   
@arg_space(some_A_inst)   
def set_args():
    a = 1
    b = "owl"
    c = (4,8,4)
    return vars()
 
print( some_A_inst.__dict__ ) # 'a': 1, 'b': 'owl', 'c': (4, 8, 4)}
print( some_A_inst.c ) # (4,8,4)


а это концепт контекстного менеджера, он только для иллюстрации, в коде это не повторять, потому-что тут используется глобальное пространство имен - и это неоправдано целью и гарантирует возникновение проблем с переменными:

class arg_space:
  def __init__(self, obj):
      self.obj = obj
      
  def __enter__(self):
      self.__s1 = set(globals().keys())    
      return self

  def __exit__(self, exc_type, exc_value, exc_tb):
      sd = set(globals().keys()) ^ self.__s1
      gl = globals()      
      for at in sd:
          setattr(self.obj, at, gl[at])

class A: pass
some_A_inst = A()

with arg_space(some_A_inst):
   a = 1
   b = "owl"
   c = (4,8,4)
   
print( some_A_inst.__dict__ ) # 'a': 1, 'b': 'owl', 'c': (4, 8, 4)}


p.s. для хранения атрибутов есть NamedTuple, SimpleNamespace, Dataclasses
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
16 авг. 2022, в 23:20
500 руб./за проект
16 авг. 2022, в 22:28
60000 руб./за проект
16 авг. 2022, в 22:12
2000 руб./за проект