Питон: Как наследовать и отображать идентификатор, определенный в классе, вместо того, чтобы определять его в объекте

#python #class #instantiation

Вопрос:

У меня есть следующий код Python из вопроса о www.testandtrack.io:

 class Sales:
  def __init__(self,id):
    self.id=id
    id=321

val=Sales(123)
print(val.id)
 

Вывод здесь таков:
123

Я хочу иметь возможность отображать значение идентификатора объекта, но чтобы оно было тем, что изначально определено в классе, например, в данном случае «321». Я также хотел бы понять, как переопределять (как показано), когда это необходимо, но при необходимости оставлять атрибуты класса по умолчанию.

Я попытался оставить его пустым при создании экземпляра, но требуется позиционный аргумент.

 val=Sales()
 

Я также попытался удалить идентификатор из функции «конструктор», как показано ниже, но это тоже не работает:

 def __init__(self):
 

Может ли кто-нибудь указать мне правильное направление с объяснением? Я бы хотел, чтобы каждый объект по умолчанию наследовал идентификатор (или любой указанный атрибут) класса, а не должен был явно определять значения при создании. При необходимости для определенных атрибутов я хотел бы предоставить новые значения для объекта, несмотря на то, что значение определено в классе. (переопределение)

Комментарии:

1. id=321 это просто установка локальной переменной. Он перестает существовать в тот момент, когда возвращается содержащая его функция. Может быть, это должно было быть отступом на один уровень меньше, так что это часть тела класса?

2. Подождите, но теперь у меня есть противоположный вопрос. Если приведенный ниже ответ дает 321, как мне переопределить его 123?!

3. def __init__(self,id=321): предоставит значение по умолчанию для случаев, когда вызывающий абонент не предоставил значение для этого параметра.

4. Ваш последний абзац звучит именно так, как предлагает Джейсон Харпер. Если вы def f(a=1): return a , вы можете либо назвать его так, как f() в этом случае a получает значение по умолчанию 1, либо как f(2), в котором вы можете указать свое собственное значение.

Ответ №1:

Учитывая, что 321 это значение по умолчанию в случае, если идентификатор не передается, вам следует поступить следующим образом

 class Sales:
   def __init__(self, id=321):
      self.id=id

val = Sales(123)
print(val.id) 
val2 = Sales()
print(val2.id)
 

Комментарии:

1. но почему я все еще должен вводить позиционный аргумент для val=Sales(x) … с аргументом x в качестве аргумента. Разве я не должен быть в состоянии оставить это пустым>?

2. Отлично, спасибо!

3. replit.com/@benjr/MintySickSystemintegrator#main.py

Ответ №2:

 class Sales:
  def __init__(self,id):
    self.id=id
    self.id=321

val=Sales(123)
print(val.id)
 

И результат будет 321

Чтобы отредактировать идентификатор продаж, вам нужно поставить self. до. Python строго относится к этому

Комментарии:

1. Подождите, но теперь у меня есть противоположный вопрос. Если приведенный ниже ответ дает 321, как мне переопределить его 123?! Если бы ваш ответ мог дать объяснение того, как это работает, с точки зрения создания объекта со значением класса, а затем переопределения его и возможности сделать то или другое …

2. Это неправильно. self.id = id перезаписывается следующей строкой независимо от того, какой ввод вы ей даете.

3. @Thomas в любом случае, в чем смысл первого задания self.id=id

4. @Reti43 — но даже если вы удалите self.id=идентификатор, он все равно не перезапишет его новым значением 123. класс продаж: def __init__(self,идентификатор): #self.id=идентификатор self.id=321 val=Продажи(123) печать(val.id)

5. @Compoot Я не понимаю, что вы хотите сделать. Вы хотите сохранить оба значения 123 и 321 и каким-то образом получить доступ к ним?

Ответ №3:

Хорошо , я не понял вопроса, извините.

Вот способ сделать то, что вы хотите сделать :

 class Sales:
  def __init__(self):
    pass
  def set_id(self,id):
      self.id=id

val=Sales()
val.set_id(100)
print(val.id)
 

Ответ будет 100

 class Sales:
  def __init__(self):
    pass
  def set_id(self,id):
      self.id=id

val=Sales()
val.set_id(100)
val.set_id(200)
print(val.id)
 

И для этого одного это будет 200

Комментарии:

1. Ваш способ или Никерос более питонический?