Я пытаюсь расширить некоторые «базовые» классы в Python:Продление базовых классов в Python
class xlist (list):
def len(self):
return len(self)
def add(self, *args):
self.extend(args)
return None
class xint (int):
def add(self, value):
self += value
return self
x = xlist([1,2,3])
print x.len() ## >>> 3 ok
print x ## >>> [1,2,3] ok
x.add (4, 5, 6)
print x ## >>> [1,2,3,4,5,6] ok
x = xint(10)
print x ## >>> 10 ok
x.add (2)
print x ## >>> 10 # Not ok (#1)
print type(x) ## >>> <class '__main__.xint'> ok
x += 5
print type(x) ## >>> <type 'int'> # Not ok (#2)
Он отлично работает в списка случае, поскольку присоединять метод изменяет объект «на месте », не возвращая его. Но в случае int, метод add не изменяет значение внешней переменной x. Я полагаю, что это прекрасно в том смысле, что self - это локальная переменная в методе add, но это мешает мне изменить начальное значение, присвоенное экземпляру класса.
Можно ли расширить класс таким образом или я должен определить свойство класса с базовым типом и отобразить все необходимые методы для этого свойства?
Python не имеет «типов значений» и ссылочных типов. Различие между изменяемыми и неизменяемыми типами несколько схоже и не основано на таком различии. Однако ваша рекомендация использовать композицию вместо наследования велика. – 2010-04-24 18:35:59