Code trong khai báo class nghĩa là thế nào?

Bạn đừng bó hẹp hiểu biết của mình khi làm việc với python bằng 1 ngôn ngữ khác như thế. Nó sẽ làm bạn thấy bối rối với 1 số trường hợp như trên. Trong python thì object là first class citizen do đó không có gì lạ khi mà class cũng là object. Và để khai báo được class thì bạn sẽ phải tạo 1 đối tượng class và thêm thắt các thuộc tính cho class đó. Quá trình thêm thắt đó sẽ chạy code của bạn luôn => bạn thấy nó in text ngay khi đang khai báo class. Nếu để ý thì bạn sẽ thấy trong python không hề có this object. Mà thay vào đó bạn phải truyền thêm 1 đối tượng self vào các method của class đó.

5 Likes

hiểu đơn giản " class " trong python là một object, vậy nó là object của cái gì ạ?
bạn có thể đưa mình source về điều này để mình hiểu rõ hơn được ko!

Source của bạn đây: https://github.com/python/cpython/blob/master/Include/object.h

1 Like

ý mình là nguồn để đọc về cái này, chứ ko phải source code, mình có search google nhưng ko có, họ chỉ nói class rồi viết thuộc tính và phương thức vào thôi, chứ ko thấy nói 1 khi tạo 1 class chính là đang khởi tạo 1 object.

Trích: https://docs.python.org/3/tutorial/classes.html :

Classes provide a means of bundling data and functionality together. Creating a new class creates a new type of object, allowing new instances of that type to be made.

3 Likes

https://docs.python.org/3/reference/compound_stmts.html#class

The class’s suite [đây là thuật ngữ, bạn xem phần văn phạm ở trên] is then executed in a new execution frame (see Naming and binding), using a newly created local namespace and the original global namespace. (Usually, the suite contains mostly function definitions.) When the class’s suite finishes execution, its execution frame is discarded but its local namespace is saved. 3 A class object is then created using the inheritance list for the base classes and the saved local namespace for the attribute dictionary. The class name is bound to this class object in the original local namespace.

4 Likes

Chắc là metaclass thôi. Metaclass là class có tên là type. Tên metaclass trùng luôn hàm type() nên nó rối.

5 Likes

mình ko hiểu, ý mình là: tại sao lớp A không cần cú pháp khởi đối tượng của lớp A, mà chúng vẫn thực code trong đó, nhưng cái bạn đưa đọc mà chẳng hiểu gì liên quan đến câu hỏi của mình.

ok Bạn, mình sẽ đọc metaclass

trả lời đơn giản là những dòng code trong class đó cũng tương tự những dòng code ở ngoài class ấy :V Có khác 1 cái là những biến định nghĩa trong đó muốn truy cập thì phải thêm “họ” là tên class đó. Ví dụ DictNumber được truy cập bằng DictType.DictNumber. Những biến đó được gọi là class attributes là thuộc tính của class. Những biến được định nghĩa trong hàm def __init__(self) có gắn self. ở đằng trước thì mới gọi là thuộc tính của object.

6 Likes

cảm ơn Bạn, nhưng cái bạn nói mình biết rồi, và nó cũng không áp dụng được để trả lời cho câu hỏi TOPIC của mình.

cái Metaclass mình sẽ dành đọc sau, chứ mới đọc qua khó hiểu kinh.

Đây em, anh nghĩ có lẽ link này giải đáp dc thắc mắc của em

3 Likes

vậy là focus vào cái hàm print() thôi chứ ko phải cái dictnumber kia à :V

vậy thì chắc ở đây trả lời chi tiết :V

khi import module thì class được Python tạo ra (ko phải object của class đó mà là định nghĩa của class đó) và class attributes phải được khởi tạo, hay những dòng code ở class body sẽ được chạy :V Nói đơn giản là khi import 1 module trong Python tất cả các dòng lệnh trong module đó đều được chạy, chỉ trừ các dòng lệnh nằm trong function body :V :V

google cũng khó nhỉ mình gg 3-4 lần mới ra =]] trước đó gg ra câu này: https://stackoverflow.com/questions/26001511/in-python-why-does-the-code-in-class-body-gets-executed-only-when-a-method-of-an thấy Java cũng tương tự nè >_>

public class Test {
    static {
        System.out.println("Wait, what? Code is running without being called?");
    }

    public static void main(String[] args) {
        System.out.println("Nothing to see here, move along now...");
    }
}

C++ khó làm hơn nhỉ :V Code này có lẽ ăn gian vì phải khởi tạo hidden bên ngoài class rồi :V

#include <iostream>

class X {
    static int hidden;
};

int X::hidden = [] {
    std::cout << "Hello world\n";
    return 0;
}();

int main() {}

edit: đúng là trong Python những gì ko nằm trong thân hàm đều được gọi hết nè :joy:

def f(a=print("Hi")):
    pass
6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?