01/10/2018, 10:52

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


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.

Henry viết 13:08 ngày 01/10/2018

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).

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

Làm thế nào để mình phân biệt được đâu là function hay method.

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

làm sao phân biệt dc khi nào có dấu ngoặc khi nào k

Đó 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

Conan Nhoc viết 13:07 ngày 01/10/2018

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 đó )

Henry viết 12:58 ngày 01/10/2018

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("__")]
Conan Nhoc viết 12:58 ngày 01/10/2018

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

Bài liên quan
0