#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. Отлично, спасибо!
Ответ №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. Ваш способ или Никерос более питонический?