01/10/2018, 00:41

Thắc mắc về class trong Python

Như mọi người đã thấy trong đoạn code. E đã dùng cái classmethod return về 4 value chạy 4 cái arg vào class. Nhưng nó báo chỉ có 2. E vẫn chưa hiểu lắm về đoạn này. Không biết 2 đâu ra vì nếu nó không cho return value trả về gán vào biến như 2 dòng chú thích thì cũng chỉ có 1.
Mong mọi người giải đáp.

*grab popcorn* viết 02:49 ngày 01/10/2018

Vì split trả về một list object.
Nên khi truyền vô kia thì nó hiểu cái list ở đây như 1 tham số nên nó hũ lỗi.

Nguyễn Thành Trung viết 02:49 ngày 01/10/2018

Vậy có phải là list được tính là 2 args

Lương Quang Mạnh viết 02:51 ngày 01/10/2018

Sửa thế này:
stud1 = Student(*Student.splitStr(sequence))

* ở đây là dấu unpack arguments, dùng trong lời gọi hàm (khác với dấu gộp arguments trong định nghĩa hàm) sẽ tách cái list mà Student.splitStr trả về ra thành từng argument riêng rẽ.
Viết như bạn thì self + 1 cái list chỉ là 2 tham số truyền vào thôi.

Gió viết 02:53 ngày 01/10/2018

stu1=Student.(*Student.splitStr(sequence))

Nguyễn Thành Trung viết 02:56 ngày 01/10/2018

Vâng, chạy được rồi ạ…e cám ơn :v

Lương Quang Mạnh viết 02:52 ngày 01/10/2018

Lần sau nên nhét code vào markdown nhé, đừng chụp màn hình.

Nguyễn Thành Trung viết 02:50 ngày 01/10/2018

vâng vâng ^^ e sẽ lưu ý

Thanos viết 02:53 ngày 01/10/2018

anh nói kỹ về cái * được không ạ?

Khi nào thì nó là unpack Arguments, khi nào thì nó gộp các arguments lại thành tuple ạ?

Lương Quang Mạnh viết 02:54 ngày 01/10/2018
  • Trong lời gọi hàm, * unpack 1 sequence ra thành các argurments bình thường; còn ** unpack 1 dict ra thành keyword arguments.
  • Trong khai báo hàm, * gộp tất cả những arguments bình thường thành 1 tuple, ** gộp tất cả keyword arguments thành 1 dict.
  • Trong Python 3, bạn có thể dùng kết hợp với tuple assignment.

VD:

def foo(*args, **kwargs):
    print(args)  # tuple
    print(kwargs)  # dict

foo(1, 2, 3, a = 4, b = 5)
# args = (1, 2, 3)
# kwargs = {a = 4, b = 5}


def bar(x, y, z, m = 0, n = 0):
    pass

alist = [3, 2, 1]
adict = {n = 5, m = 4}
bar(*alist, **adict)
# x = 3, y = 2, z = 1, m = 4, n = 5


# Python 3, tuple assignment
a, *b, c = 1, 2, 3, 4, 5, 6
# a = 1
# b = [2, 3, 4, 5]
# c = 6

Bạn có thể tham khảo thêm ở đây: http://hangar.runway7.net/python/packing-unpacking-arguments
Nhưng chỗ này vẫn chưa đầy đủ đâu, quyển Learning Python (5th Edition) nói đầy đủ và chi tiết hơn nhiều. Nhưng nó khá dày và nó ở đâu mình quên mất tiêu rồi. (dù sao, quyển này rất hay và đáng đọc).

Bài liên quan
0