Полезное Наследование в Python соотв. Альтернатива для интерфейсов - PullRequest
1 голос
/ 10 ноября 2009

Привет, насколько я вижу в Python, переменные нетипизированы. Так что теперь я хочу иметь базовый класс

class baseClass:
 def x():
  print "yay"

и два подкласса

class sub1(baseClass):
 def x(): 
  print "sub1"

class sub2(baseClass):
 def x():
  print "sub2"

на других языках программирования, которые я могу разрабатывать на основе интерфейсов, подобных

baseClass c = new sub1()

так что теперь я могу использовать c в качестве базового класса с функциональностью sub1 и, возможно, во время выполнения я могу изменить его с помощью

c = new sub2()

Возможно ли это и в python?

Ответы [ 3 ]

5 голосов
/ 10 ноября 2009

Да.

c = sub1()
c = sub2()

Но базовый класс и концепция определения интерфейса не нужны, так как python статически не типизирован.

EDIT:

Чтобы переписать ваш код на допустимом Python:

# This space where baseClass was defined intentionally left blank, 
# because it serves no purpose

class Sub1(object):
  def x(self): 
    print "sub1"

class Sub2(object):
  def x(self):
    print "sub2"

c = Sub1()
c = Sub2()
2 голосов
/ 10 ноября 2009

Да, вы можете сделать это; однако синтаксис для создания экземпляров объектов не является «новым классом (аргументами)». Просто бросьте «новый».

Сделав шаг назад, предположим, что у вас есть объект, хранящийся в переменной с именем foo. Компилятор никогда не будет жаловаться на то, что вы делаете следующее:

foo.bar

Это верно, даже если foo не может иметь панель свойств. Это связано с тем, что foo имеет атрибут с именем bar, определяется во время выполнения (вот почему Python является динамически типизированным языком). Если в вашем коде есть проблема с типом, вы можете не узнать об этом, пока не запустите его (т.е. время выполнения).

В Python интерфейсы устанавливаются исключительно по соглашению между разработчиками одного и того же проекта. Этот метод работы с интерфейсами известен как duck typing . Я предлагаю вам прочитать эту тему, так как кажется, что вы новичок в Python.

PS: Динамическая типизация может показаться плохой вещью, потому что вы не получаете проверку типов во время компиляции, но оборотная сторона этого в том, что вам нужно написать гораздо меньше. Теоретически, это делает вас гораздо более продуктивным. По моему опыту, это имеет тенденцию подтверждаться.

1 голос
/ 10 ноября 2009

Python действительно не имеет «переменных». У Python есть имена, с которыми связаны объекты.

class X(object):
    pass
class Y(object):
    pass
class Z(object):
    pass

a = X  # name "a" bound with class object "X"

print(a is X)  # prints True

a = Y
print(a is Y)  # prints True
b = Y
print(a is b)  # prints True

Приведенный выше код показывает связывание имени «a» с первым одним объектом (объект класса, определенный как «X»), а затем с другим объектом (объект класса «Y»). Затем мы связываем «b» с объектом класса «Y». «a» и «b» относятся к одному и тому же объекту, поэтому тест is возвращает True.

Python строго типизирован. Пока «а» связан с объектом класса «Y», тип «а» является типом объекта класса. Например, если вы попытаетесь использовать «a» в математическом выражении, Python вызовет исключение TypeError, потому что «a» будет неправильным классом.

print(a + 3)  # causes TypeError exception

Но всегда разрешается привязывать имя к другому объекту, который может иметь другой тип.

a = 3
print(a + 3)  # prints 6

Хорошее объяснение здесь: http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#python-has-names

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...