Hỏi về class, attribute, method trong Python

Mình có 1 thắc mắc như sau. Giả sử bắt đầu với 1 thư viện cơ bản như “string” mình print ra dictionary của nó như hình :slight_smile:


Theo mình hiểu các kí hiệu “__”(gạch 2 chân dưới) là class, thế kí hiệu “_”(gạch 1 chân) ám chỉ gì vậy(mình nhớ có đọc qua rồi mà quên).
Các cái còn lại là function ,method hoặc attribute. Làm thế nào để mình phân biệt được đâu là function hay method. Mình hay bị nhầm lẫn vd như đối tượng x nào đó có method Formatter thì viết là x.Formatter hay x.Formatter() ( chẳng hạn như x là 1 dataframe thì shape là x.shape, còn xem mấy dòng đầu là x.head() làm sao phân biệt dc khi nào có dấu ngoặc khi nào k)
Mong các bạn giúp đỡ mình mới học nên hơi k rõ về vẫn đề này.

Nó là Special (Magic/Dunder) Methods.

Function là một hàm, Method là một function của một lớp.

Đó gọi là function (method) thì là callable, còn attribute thì không. Do đó function hoặc method phải có ngoặc (). Còn attribute không phải là callable nên không có ngoặc.
Nhưng, một attribute có thể là một method của một lớp

class a:
    @property
    def name(self):
         return self.name

Thì name chính là attribute, không phải method

1 Like

Cảm ơn bạn rất nhiều. Cho mình hỏi là khi mà dùng lệnh print(dir(string)) chẳng hạn có rất nhiều function, method và attribute trong đó. Có thể phân biệt dc đâu function, method và attribute ( ý là có ranh giớ nào để nhìn là biết là function, method và attribute mà ko cần thử k hay phải đọc tài liệu về library đó )

Hãy tưởng tượng ta có class như sau

class a:
    name = 'haha'
    def say(self):
        return self.name

Tiếp đến ta dùng hàm getattr

# method cũng được coi là một attribute của một class
>>> getattr(a, 'name')
'haha'
>>> getattr(a, 'say')
<function a.say at gì gì đấy>

Mình đã đề cập, function hay là method trong class là những thứ callable.

for func in dir(a):
    if callable(getattr(a, func)):  # kiểm tra xem, func có phải là callable không
        print(func)

Nhưng có thể bạn vẫn sẽ không được kết quả mong muốn, vì một lớp mặc định của Python không chỉ có chừng đấy method. Thế nên bạn có thể thêm một chút thế này

for func in dir(a):
    if callable(getattr(a, func)):  # kiểm tra xem, func có phải là callable không
        if not func.startswith('__'):  # kiểm tra xem tên có bắt đầu bằng __ hay không
            print(func)

Tất cả những thứ trên có thể rút gọn

method_list = [func for func in dir(a) if callable(getattr(a, func)) and not func.startswith("__")]
2 Likes

Cảm ơn bạn rất nhiều

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