Làm thế nào để phân lớp đơn giản là list
(ví dụ chính về khả năng thay đổi trong Python)?
class CharList(list):
def __init__(self, s):
list.__init__(self, s)
@property
def list(self):
return list(self)
@property
def string(self):
return "".join(self)
def __setitem__(self, key, value):
if isinstance(key, int) and len(value) != 1:
cls = type(self).__name__
raise ValueError("attempt to assign sequence of size {} to {} item of size 1".format(len(value), cls))
super(CharList, self).__setitem__(key, value)
def __str__(self):
return self.string
def __repr__(self):
cls = type(self).__name__
return "{}(\'{}\')".format(cls, self.string)
Chỉ tham gia danh sách quay lại chuỗi nếu bạn muốn in hoặc chủ động yêu cầu biểu diễn chuỗi. Việc thay đổi và mở rộng là không đáng kể và người dùng biết cách thực hiện nó vì đó chỉ là danh sách.
sử dụng Ví dụ:
s = "te_st"
c = CharList(s)
c[1:3] = "oa"
c += "er"
print C# prints "toaster"
print c.list # prints ['t', 'o', 'a', 's', 't', 'e', 'r']
Sau đây là cố định, xem cập nhật dưới đây.
Có một (solvable) caveat: Không có kiểm tra (chưa) rằng mỗi phần tử thực sự là một nhân vật. Nó sẽ ít nhất là thất bại in ấn cho tất cả mọi thứ nhưng dây. Tuy nhiên, những người có thể tham gia và có thể gây ra những tình huống kỳ lạ như thế này: [xem mã ví dụ dưới đây]
Với tùy chỉnh __setitem__
, gán một chuỗi có độ dài = 1 tới một mục CharList sẽ nâng cao một ValueError
!. Mọi thứ khác vẫn có thể được gán tự do nhưng sẽ tăng TypeError: sequence item n: expected string, X found
khi in, do hoạt động string.join()
. Nếu đó là không đủ tốt, kiểm tra hơn nữa có thể được thêm vào một cách dễ dàng (có khả năng còn __setslice__
hoặc bằng cách chuyển các lớp cơ sở để collections.Sequence
(hiệu suất có thể khác ?!), xem here)
s = "test"
c = CharList(s)
c[1] = "oa"
# with custom __setitem__ a ValueError is raised here!
# without custom __setitem__, we could go on:
c += "er"
print C# prints "toaster"
# this looks right until here, but:
print c.list # prints ['t', 'oa', 's', 't', 'e', 'r']
Chức năng hoạt động khá tốt cho việc này mục đích. –
Một vài liên kết: [LINK1] (http://mail.python.org/pipermail/tutor/2003-August/024485.html), [LINK2] (http://www.skymind.com/~ocrow/ python_string /) – digEmAll
Bạn có thể giải thích, tại sao bạn cần chuỗi có thể thay đổi? Trường hợp sử dụng là gì? –