class, __init__ и def подскажите логику. Вопрос простой :-)
Имею код следующего вида:
class testirovanie:
eins=None
zwei=None
def __init__(self,ferst=None, second=None):
self.eins=ferst
self.zwei=second
def test(self, odin=eins, dva=zwei):
pervi=odin
vtoroi=dva
print(pervi,vtoroi)
В моём понимании должно быть так:
#IN:
testirovanie(1,2).test()
testirovanie().test(1,2)
#OUT:
1 2
1 2
По факту имею:
#OUT:
None None
1 2
Подскажите, пожалуйста, в чём заблуждаюсь и что нужно сделать чтобы:
# При IN:
testirovanie(1,2).test()
#Иметь OUT:
1 2
Ответы (2 шт):
Немного не понимаю цели кода, но укажу на некоторые детали
- Метод
__init__()срабатывает всегда, когда вы создаете экземпляр класса, то есть когда вызываетеtestirovanie() - Класс принято называть английским существительным с заглавной буквы
class Test: - Экземпляр класса будет содержать те данные, которые вы укажите в
__init__(), но они будут относиться только к одному экземпляру и доступны по ключевому словуselfв методах класса. Если ваша реализация метода не содержитself- это значит, что определенные переменные не имеют ничего общего с полями класса.einsне то же самое, чтоself.einsдля всех реализаций класса. - Статические поля определенные в самом начале класса становятся не доступными (через экземпляр), если вы используете те же имена для не статических полей в методе
__init__(). Здесь вот мне не понятно, что вы пытаетесь реализовать.
с учетом вышесказанного
class Test:
eins = "None из статического атрибута eins"
zwei = "None из статического атрибута zwei"
def __init__(self,ferst=None, second=None):
self.eins=ferst
self.zwei=second
def test(self, odin=eins, dva=zwei):
print(f"это то что содержит экземпляр {self.eins}, {self.zwei}")
# Вот этот участок кода забирает статические поля по умолчанию
# или забирает указанные значения при вызове данного метода
pervi=odin
vtoroi=dva
print(f"print из test {pervi},{vtoroi}")
Обратимся к полям. Если мы используем экземпляр класса, тогда и поле мы должны указывать у экземпляра класса. Но при этом статическое значение атрабута в классе останется неизменным
t = Test(1,2)
print(t.eins, Test.eins)
(1, 'None из статического атрибута eins')
То есть надо понимать, что если вы хотите работать с переменной конкретного экземпляра, то ее надо использовать через экземпляр класса.
Что же с методом test. Я разделил значения и дал комментарии, чтобы было понятно откуда, что прилетает
>>> Test().test()
это то что содержит экземпляр None, None
print из test None из статического атрибута eins,None из статического атрибута zwei
>>> Test(1,2).test()
это то что содержит экземпляр 1, 2
print из test None из статического атрибута eins,None из статического атрибута zwei
>>> Test().test(1,2)
это то что содержит экземпляр None, None
print из test 1,2
>>> Test(1,2).test(1,2)
это то что содержит экземпляр 1, 2
print из test 1,2
Обратимся к последнему примеру и подчеркнем, что значения 1 и 2 не имеют ничего общего с полями класса, ни с какими. Это просто значения переданные в метод.
Ожидаете вы наверное вот это
class Test:
def __init__(self, first=None, second=None):
self.first = first
self.second = second
def test(self, first=None, second=None):
if first and second:
self.first = first
self.second = second
print(self.first, self.second)
вывод
>>> Test().test()
None None
>>> Test(1,2).test()
1 2
>>> Test().test(1,2)
1 2
>>> Test(1,2).test(1,2)
1 2
Как вариант:
class MyTest:
eins = None
zwei = None
def __init__(self, ferst=None, second=None):
self.eins = ferst
self.zwei = second
def test(self, odin=None, dva=None):
if odin: self.eins = odin
if dva: self.zwei = dva
print(self.eins, self.zwei)
test_1 = MyTest(1, 2)
test_1.test()
test_1.test(3, 7)
