2017-02-22 14 views
6

Python có hàm dựng sẵn type và mỗi phiên bản cũng có thuộc tính __class__. Tôi thường tin rằng họ đã trở lại cùng một điều. Ngay cả những tài liệu của cả hai âm thanh tương tự:Khi nào thì kiểu (instance) không phải là instance .__ class__?

instance.__class__

Lớp mà một cá thể của lớp thuộc.

type(object)

Với một đối số, trả về kiểu của một đối tượng.

Tuy nhiên trong abc.ABCMeta.__instancecheck__ có một tấm séc nếu họ là giống hệt nhau (hơi ngắn):

subclass = instance.__class__ 
subtype = type(instance) 
if subtype is subclass: 

Khi nào thì đây không phải là trường hợp? Khi nào là type(instance) không giống với instance.__class__?

+0

Có thể trùng lặp http://stackoverflow.com/questions/9610993/python-type-or-class-or-is – Kasramvd

+0

@Kasramvd Cảm ơn liên kết đó, tôi tin rằng đó có thể là bản sao của luồng lưu trữ http: // stackoverflow. com/questions/1060499/khác biệt-giữa-typeobj-và-obj-class. Tôi không chắc chắn lý do tại sao họ không xuất hiện khi googling câu hỏi và không có trong "bản sao được đề xuất" khi đặt câu hỏi. – MSeifert

+0

Điều đó đôi khi xảy ra;) – Kasramvd

Trả lời

2

Đây là trường hợp đối tượng kiểu cũ (kế thừa từ không có gì). Các đối tượng như vậy không có thuộc tính __class__. Tôi nghĩ họ làm theo cách này để ngăn ngừa lỗi. Ví dụ cho Python 2.7:

class A: 
    pass 

class B(object): 
    pass 

a = A() 
b = B() 

print(dir(a)) # ['__doc__', '__module__'] 
print(dir(b)) # ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] 

print(b.__class__) # <class '__main__.B'> 
print(type(b))  # <class '__main__.B'> 

##################### 
# The intersting part 
print(a.__class__) # __main__.A 
print(type(a))  # <type 'instance'> 


print(B.__class__) # <type 'type'> 
print(type(B))  # <type 'type'> 

print(type(A))  # <type 'classobj'> 
#print(A.__class__) # AttributeError: class A has no attribute '__class__' 

Xem này để biết thêm thông tin:

Lưu ý: Các dòng cung cấp từ CPython đã được thay đổi trong 2008 thời gian qua (commit), do đó, nó thực sự có vẻ là một điều tương thích hoặc họ chỉ quên nó.

+0

Trong khi đó có ý nghĩa - Tôi đã suy nghĩ về (quên đề cập rõ ràng) về python 3.x và không có lớp học kiểu cũ nữa . – MSeifert

+0

@MSeifert Các dòng nhất định từ cpython đã được thay đổi trong năm 2008 thời gian qua (https://github.com/python/cpython/commit/68f5fbe94488b671ee6dfae74d918cc6a8eeca56), do đó, nó có vẻ là một điều tương thích hoặc họ chỉ quên nó. – ppasler

+0

@MSeifert Tôi đã cập nhật câu trả lời của mình. – ppasler

Các vấn đề liên quan