m1r42
class class1(object):
def __init__(self):
self.a = ""
x = class1()
x.a = "first"
y = class1()
y.a = "second"
check = False
for i in range(0,10):
check = not check
if check == True:
q = x.a
print(q)
if check == False:
q = y.a
print(q)
Собственно вопрос в том можно ли вместо объекта установить некий шаблон, а в начале цикла только менять имя x на y и наоборот?
Это твой изначальный код
class class1(object):
def __init__(self):
self.a = ""
x = class1()
x.a = "first"
y = class1()
y.a = "second"
check = False
for i in range(0,10):
check = not check
if check == True:
q = x.a
print(q)
if check == False:
q = y.a
print(q)
Это код с “шаблоном”
class class1(object):
def __init__(self):
self.a = ""
x = class1()
x.a = "first"
y = class1()
y.a = "second"
check = False
for i in range(0,10):
check = not check
if check == True:
q = x
if check == False:
q = y
print(q.a)
Это вывод в консоли для кода с “шаблоном”
>>> class class1(object):
... def __init__(self):
... self.a = ""
...
>>> x = class1()
>>> x.a = "first"
>>>
>>> y = class1()
>>> y.a = "second"
>>>
>>> check = False
>>> for i in range(0,10):
... check = not check
... if check == True:
... q = x
... if check == False:
... q = y
... print(q.a)
...
first
second
first
second
first
second
first
second
first
second
>>>
m1r42
Хочу услышать мнение экспертов по этому вопросу. Типа, почему я не прав и почему так делать нельзя.
Имена в питоне не привязаны к объектам сначала и навсегда.
Например
>>> int(1)
1
>>> int = float
>>> int(1)
1.0
>>>
>>> int = 'abc'
>>> int(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable
>>> print(int)
abc
>>>
Есть имя int и есть имя float. Эти имена привязаны к классам. Но в любой момент имя можно перевязать к другому объекту. Объектом может быть какой-то класс, а может быть какое-то число или какая-то строка. Поначалу имя int привязано к классу для создания целых чисел. Поначалу имя float привязано к классу для создания вещественных чисел. Но перевязывая имя int с класса для создания целых чисел к классу для создания вещественных чисел, мы через это имя можем создавать вещественные числа. А потом, перевязывая имя int с класса для создания вещественных чисел к объекту строка, мы через это имя можем получать эту строку.
m1r42
Хочу понять, возможно ли такое наследование и какими проблемами оно грозит в дальнейшем?
Это не наследование.
Пример наследования
>>> class MyInt(int):
... def __init__(self, value):
... self.root = value ** 0.5
...
>>> number = MyInt(4)
>>>
>>> number
4
>>> number.root
2.0
>>>
Мы пронаследовали класс MyInt от класса int и добавили в классе-наследнике MyInt к самому числу ещё и корень этого числа.
Наследование проводится для того, чтобы использовать то, что уже есть, чтобы это повторно всё не описывать. Поэтому в данном примере весь функционал класса int просто наследуется напрямую, а потом своё мы уже добавляем к унаследованному функционалу просто в виде описания. А дальше мы можем пронаследоваться от класса MyInt и использовать функционал int и функционал MyInt, чтобы в классе-наследнике всё это повторно не описывать.
>>> class MyInt(int):
... def __init__(self, value):
... self.root = value ** 0.5
...
>>> class MyPrettyInt(MyInt):
... def __str__(self):
... return 'My value is {}, my root is {}.'.format(self.real, self.root)
...
>>> number = MyPrettyInt(4)
>>>
>>> print(number)
My value is 4, my root is 2.0.
>>>
m1r42
Люблю критику в стиле “ты ничего не понимаешь в ООП, надо тебе вернуться в процедурную парадигму программирования ”
Так что ты даже когда термин “наследование” используешь, ты не понимаешь, о чём говоришь, потому что просто ничего не знаешь, так как не читал никаких книг особо. Поэтому тебе и говорят, что тебе ООП не нужно на данном этапе, ты его не поймёшь ещё пока что, даже если там сто кодов напишешь с ним. ООП - слишком обширная и объемлющая тема; немногие опытные программисты понимают её даже (хоть и знают синтаксис записи), и из-за этого у них ООПшных программ нет (программ размером в 20000 и более строк), а они этого даже не замечают, просиживая за компом десятки лет и всем рассказывая, какие они крутые асинхронные программисты. Хочется только улыбаться и плакать, сочувствуя им. Так что начинай с процедурок, на них можно всё написать, что тебе нужно и будет нужно в ближайшие три года. Если не можешь написать на процедурках и якобы тебе нужно ООП для этого, то это значит, что ты процедурки просто плохо освоил. Раньше все игры писали на процедурках и всё работало прекрасно. Тот же тетрис возьми, змёйку, крестики-нолики, морской бой, шахматы, гонки формулы один, - это всё писалось на процедурках.