Thắc mắc về kiểu dữ liệu động trong Python

Chào mọi người, mình đang học Python. Về kiểu dữ liệu trong Python, mình có một vài thắc mắc, mong các bạn giải đáp:

  1. Làm cách nào để có thể tạo ra một kiểu dữ liệu người dùng định nghĩa tương tự như Struct trong C++ hoặc C# ?
  2. Vì Python là ngôn ngữ kiểu động, nên khi truyền tham số vào hàm, ta không cần xác định kiểu của tham số. Vậy với trường hợp kiểu người dùng tự định nghĩa hay các kiểu dữ liệu ta import từ các module khác, cơ chế nào để Python biết được tham số đó thuộc kiểu gì và các thuộc tính của nó ?
    Cảm ơn mọi người
  1. Bạn có thể dùng class trong Python để làm điều này:
# python2
class Book:
    name   = str()
    author = str()
    price  = 0
    currency = str()
# 
# create an array of structs with _n members
def create_array_structs(_class,  _n):
    _as = list()
    for i in xrange(_n):
        _as.append(_class())
    return _as
#
# demo:
#  create an array with 5 structs of Book
books = create_array_structs(Book, 5)
books[0].name   = "Python"
books[0].author = "Guido van Rossum"
books[0].price  = 0
books[0].currency = "USD"
# books[1]...
#...

2 . Mình không chắc là giải thích cho bạn hiểu được (vì mình cũng “sơ sơ” thôi). Tốt nhất là tải mã nguồn Python về tham khảo.

Mình hiếu ý của bạn là tạo một class Book, sau đó set tất cả các thuộc tính với phương thức thành public? À mà tại sao tên tham số truyền vào của bạn lại có “_” phía trước, có ý nghĩa gì đặc biệt không ?

Tất thành phần trong class Python đều public mà, tuy là có cách “giấu” biến nhưng nó vẫn là public (truy cập thông qua 1 cách khác) :joy:
Còn tên tham số có có dấu “_” phía trước là vì mình thích đặt vậy :joy: nếu để chữ “class” hay “as” thì trùng với từ khóa (mình cũng muốn nhấn mạnh: tham số truyền vào là class, không phải instance hay bất kỳ thứ gì khác), mình cũng tự quy ước với bản thân cho cách đặt tên biến và tên hàm đó mà (quen tay với C rồi, chưa quên OOP nó vậy :joy:).

Mình có cùng thắc mắc như bạn

Vì Python là ngôn ngữ kiểu động, nên khi truyền tham số vào hàm, ta không cần xác định kiểu của tham số. Vậy với trường hợp kiểu người dùng tự định nghĩa hay các kiểu dữ liệu ta import từ các module khác, cơ chế nào để Python biết được tham số đó thuộc kiểu gì và các thuộc tính của nó ?

Gọi isinstance().

def fun(x):
    if isinstance(x, int):
        # code
    elif isinstance(x, str):
        # code
    ...
3 Likes

If it walks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.

Python check type at run time, nếu không thỏa mãn thì sẽ raise exception thôi bạn.

2 Likes

Câu số 1:
Cái đó có thể tạo bằng cách y như cách mà nó tạo ra một kiểu dữ liệu mặc định như int, float còn đi sâu vào thì mình bó tay
Câu hỏi số 2:
Mọi thứ trong python đều đc tổ chức dưới dạng một object(khá giống vs class bên C)
Cũng vì vây mà nó có các method (các hàm của cái object đó)
Khi chạy thì python ko thực sự quan tâm đến kiểu dữ liệu mà chỉ lấy nó để thực hiện
Vd: a+b thì nó sẽ gọi lệnh a.__add__(b) và nếu ko có method __add__ trong a thì nó sẽ báo lỗi
Đó là điểm khác giữa python vs C

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?