LINUX.ORG.RU

[python] сложение классов

 


0

0

Моя запуталось. Есть класс:

class Core:
    def __init__(self):
        pass

и сабклассы:

class A(Core):
    pass
class B(Core):
    pass

Хочу определить в Core метод __add__ так, чтобы A+B вызывало TypeError, не могу понять как.

★★

В python принят duck typing. То есть лучше ловить эксепшн, который происходит во время попытки сложить A и B (если их, действительно, нельзя сложить).

Davidov ★★★★
()
Ответ на: комментарий от Davidov

delete_comment.jsp


Да не, я не могу понять, как в __add__ узнать, что аргументами сложения являются экземпляры разных классов, то есть:

A + A = success
A + B = raise TypeError

P.S. Или надо подобное делать по-другому ?

spiro ★★
() автор топика
Ответ на: комментарий от spiro
def __add__(self, other):
  if type(self) != type(other):
    raise TypeError("undefined addition: %s, %s" % (type(self), type(other)))
  ...

?

P.S. Про какой из питонов речь, кстати?

balodja ★★★
()
Ответ на: комментарий от balodja

А, тут вообще речь про сложение классов. Так это типичное сравнение тогда.

balodja ★★★
()
Ответ на: комментарий от AlexKiriukha
class Core:
    def __init__(self, n):
        self.n = n


class A(Core):
    pass

class B(Core):
    pass


a = A(10)
aa = A(5)

b = B(20)
bb = B(25)

aaa = a + aa - успешно, aaa.n = 15
bbb = a + bb - TypeError

хочется как-то так ...

spiro ★★
() автор топика
Ответ на: комментарий от spiro

Ну раз хочется:

class Core(object):
	def __init__(self, n):
		self.n = n
	def __add__(self, other):
		if type(self) != type(other):
			raise TypeError("undefined addition: %s, %s" % (type(self), type(other)))
		return type(self)(self.n + other.n)
 
 
class A(Core): 
    pass 
 
class B(Core): 
    pass 
 
 
a = A(10) 
aa = A(5) 
 
b = B(20) 
bb = B(25) 
 
aaa = a + aa 
bbb = a + bb 

И еще раз: про какой питон речь?

balodja ★★★
()
Ответ на: комментарий от balodja
if is not isinstanse(b, self.__class__):
   raise Exception("Урод криворукий, смотри что складываешь!!1")
true_admin ★★★★★
()
Ответ на: комментарий от balodja

Неправда

Python 2.5.2 (r252:60911, Jan 20 2010, 23:16:55) 
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> raise Exception("ZHOPA")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: ZHOPA
>>> 

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Тем не менее непосредственный синтаксис указан другой. Ладно, фиг с ним, с raise'ом, с except так уже не прокатит.

balodja ★★★
()
Ответ на: комментарий от true_admin

Меня больше интересует вопрос, чем isinstance в данном случае лучше сравнения типов? Хотя... чисто идеологически конечно же лучше, сравнение типов в наследование не укладывается, конечно.

balodja ★★★
()
Ответ на: комментарий от ntp

там не обосновывают это, без обоснования рекоммендации неинтересны. Кроме того офицальная документация не всегда права потому как устаревает и никто её не вычитывает.

true_admin ★★★★★
()
Ответ на: комментарий от ntp

Чукча не читатель? Вопрос не стоял как «зачем вообще использовать isinstance?»

balodja ★★★
()

Перегрузка операторов вроде «+» выдает говнодизайн, говнокод и разруху в головах. Особенно в питоне.

Love5an
()
Ответ на: комментарий от Love5an

> Перегрузка операторов вроде «+» выдает говнодизайн, говнокод и разруху в головах. Особенно в питоне.

Скажем так, захотелось мне своих п-адических чисел с блекджеком и шлюхами. Так что теперь, если определю __add__ для них, то весь код сразу станет говнокодом?

balodja ★★★
()
Ответ на: комментарий от true_admin

> там не обосновывают это, без обоснования рекоммендации неинтересны.

man SOLID и Liskov Substitution Principle в частности.

устаревает и никто её не вычитывает. Серьёзно, там бывают ошибки.

Пруф или не было.

ntp
()
Ответ на: комментарий от ntp

> man SOLID и Liskov Substitution Principle в частности.

Опять же, паттерны проектирования. Не серебряная пуля. Хотя подход безусловно хороший и правильный.

balodja ★★★
()
Ответ на: комментарий от ntp

При чём тут man solid? Я сказал что рекомендации без обоснования мало чего стоят потому что их проверить нельзя. ООП тут ни при чём.

Пруф вот(тока открытые тикеты, закрытых сильно больше, штук пять я создал когда время было):
http://bugs.python.org/issue?%40search_text=&title=&%40columns=title&id=&%40c...

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.