Почему расширение класса List здесь не работает - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь расширить класс List в Python, чтобы он мог иметь функцию размера.Ниже приведен мой код:

class Mylist(List):
    self.slist = []
    def __init__(self, slist=[]):
        self.slist = slist
        super(slist)
    def size(self):
        return len(slist)

ll = Mylist([1,2,3])
print(ll.size())

Однако он выдает следующую ошибку:

$ python3 mylist.py 
Traceback (most recent call last):
  File "mylist.py", line 1, in <module>
    class Mylist(List):
NameError: name 'List' is not defined

Какое имя класса Python List я могу использовать здесь?

Я использую Python 3.5.3 на Debian Stable Linux.

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Начнем с того, что правильный способ сделать super это super().__init__()

Также код работает без super, и, как уже указывало @ user2357112, нам даже не нужен конструктор, так как self - это уже список, поэтому гораздо более простой версией будет

class Mylist(list):

    def size(self):
        return len(self)

print(Mylist([1,2,3]).size())
print(Mylist([]).size())

Вывод

0
3

И теперь другие операции со списком также могут использоваться здесь

x = Mylist([1,2,3])
x.append(4)
print(x)
#[1, 2, 3, 4]
x.extend([5,6,7])
print(x)
#[1, 2, 3, 4, 5, 6, 7]
0 голосов
/ 09 мая 2019

Установите параметр в конструкторе, и вы можете использовать методы по умолчанию list class.

class Mylist(list):
    def __init__(self, slist=[]):
        super(Mylist, self).__init__(slist)
    def size(self):
        return super(Mylist, self).__len__()

ll = Mylist([1,2,3])
ll.append(43)
print(ll)
print(ll.size())

Выход:

[1, 2, 3, 43]
4

Вы можете переопределить любой из следующих методов:

>>> help(list)
Help on class list in module builtins:

class list(object)
 |  list() -> new empty list
 |  list(iterable) -> new list initialized from iterable's items
 |  
 |  Methods defined here:
 |  
 |  __add__(self, value, /)
 |      Return self+value.
 |  
 |  __contains__(self, key, /)
 |      Return key in self.
 |  
 |  __delitem__(self, key, /)
 |      Delete self[key].
 |  
 |  __eq__(self, value, /)
 |      Return self==value.
 |  
 |  __ge__(self, value, /)
 |      Return self>=value.
 |  
 |  __getattribute__(self, name, /)
 |      Return getattr(self, name).
 |  
 |  __getitem__(...)
 |      x.__getitem__(y) <==> x[y]
 |  
 |  __gt__(self, value, /)
 |      Return self>value.
 |  
 |  __iadd__(self, value, /)
 |      Implement self+=value.
 |  
 |  __imul__(self, value, /)
 |      Implement self*=value.
 |  
 |  __init__(self, /, *args, **kwargs)
 |      Initialize self.  See help(type(self)) for accurate signature.
 |  
 |  __iter__(self, /)
 |      Implement iter(self).
 |  
 |  __le__(self, value, /)
 |      Return self<=value.
 |  
 |  __len__(self, /)
 |      Return len(self).
 |  
 |  __lt__(self, value, /)
 |      Return self<value.
 |  
 |  __mul__(self, value, /)
 |      Return self*value.n
 |  
 |  __ne__(self, value, /)
 |      Return self!=value.
 |  
 |  __new__(*args, **kwargs) from builtins.type
 |      Create and return a new object.  See help(type) for accurate signature.
 |  
 |  __repr__(self, /)
 |      Return repr(self).
 |  
 |  __reversed__(...)
 |      L.__reversed__() -- return a reverse iterator over the list
 |  
 |  __rmul__(self, value, /)
 |      Return self*value.
 |  
 |  __setitem__(self, key, value, /)
 |      Set self[key] to value.
 |  
 |  __sizeof__(...)
 |      L.__sizeof__() -- size of L in memory, in bytes
 |  
 |  append(...)
 |      L.append(object) -> None -- append object to end
 |  
 |  clear(...)
 |      L.clear() -> None -- remove all items from L
 |  
 |  copy(...)
 |      L.copy() -> list -- a shallow copy of L
 |  
 |  count(...)
 |      L.count(value) -> integer -- return number of occurrences of value
 |  
 |  extend(...)
 |      L.extend(iterable) -> None -- extend list by appending elements from the iterable
 |  
 |  index(...)
 |      L.index(value, [start, [stop]]) -> integer -- return first index of value.
 |      Raises ValueError if the value is not present.
 |  
 |  insert(...)
 |      L.insert(index, object) -- insert object before index
 |  
 |  pop(...)
 |      L.pop([index]) -> item -- remove and return item at index (default last).
 |      Raises IndexError if list is empty or index is out of range.
 |  
 |  remove(...)
 |      L.remove(value) -> None -- remove first occurrence of value.
 |      Raises ValueError if the value is not present.
 |  
 |  reverse(...)
 |      L.reverse() -- reverse *IN PLACE*
 |  
 |  sort(...)
 |      L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*
 |  
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |  
 |  __hash__ = None

Вот ответ Stackoverflow от Shital Shah , чтобы узнать больше о super() вызовах в Python.

...