Я впервые обхожусь с Python и застрял здесь:
class A:
def __init__(self):
a = foo("baa")
class B(A):
b = foo("boo")
def foo(string):
return string
В этот момент я загружаю вышеуказанный файл (с именем classes
), и это происходит:
$ python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from classes import *
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "classes.py", line 5, in <module>
class B(A):
File "classes.py", line 6, in B
b = foo("boo")
NameError: name 'foo' is not defined
Обратите внимание, как ошибка в классе B, где foo
вызывается напрямую, а не из __init__
. Обратите внимание также, как я еще не создал экземпляр класса B
.
Первый вопрос:
- Почему возвращается ошибка? Я не создаю экземпляр класса.
Двигаемся дальше. «Проблема» решается перемещением определения foo()
на несколько строк выше:
def foo(string):
return string
class A:
def __init__(self):
a = foo("baa")
class B(A):
b = foo("boo")
Теперь я могу сделать
>>> x = B()
>>> x.b
'boo'
но я не могу сделать
>>> y = A()
>>> y.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: A instance has no attribute 'a'
Дополнительные вопросы:
- Что я не понял в
__init__
?
Не думаю, что это то же самое, что и предварительное объявление , поэтому я надеюсь, что этот вопрос не является дубликатом.
Кстати, я стремлюсь реализовать DSL, но это, в основном, повод, чтобы заставить себя изучать python.