2012-03-03 37 views
10

Để xác định lớp, tôi có thể làm như vậy:Làm thế nào để xác định loại của lớp dụ

class A: pass  
a = A 

type(A) is type #True 

hay:

import inspect 
inspect.isclass(A) 

Nhưng làm thế nào để xác định loại cá thể của lớp, không biết tên lớp?

Something như thế này:

isinstance(a, a.__class__.__name__) 
#TypeError: isinstance() arg 2 must be a type or tuple of types 

Tôi tìm thấy một giải pháp, nhưng nó không làm việc với Python 3x

import types 

class A: pass 
a = A() 

print(type(a) == types.InstanceType) 
#AttributeError: 'module' object has no attribute 'InstanceType' 

Giải pháp:

if '__dict__' in dir(a) and type(a) is not type: 
+0

Bạn có hỏi về cách xác định xem một đối tượng là một lớp hay một thể hiện của một lớp không? – grifaton

+0

InstanceType là các lớp kiểu cũ, không tồn tại ở 3.x. –

+0

@grifaton, tôi muốn phân biệt lớp với trường hợp – Opsa

Trả lời

11

type(a) là loại cá thể, tức là lớp của nó. a.__class__ cũng là tham chiếu đến lớp của cá thể, nhưng bạn nên sử dụng type(a).

types.InstanceType chỉ dành cho các lớp kiểu cũ trong các phiên bản Python pre-3.0, trong đó tất cả các phiên bản đều có cùng loại. Bạn nên sử dụng các lớp kiểu mới (bắt nguồn từ object) trong 2.x. Trong Python 3.0, tất cả các lớp là các lớp kiểu mới.

+1

loại (a) chỉ hoạt động cho các lớp học theo phong cách mới! Nếu bạn đang sử dụng các lớp kiểu cũ - hãy xem liệu bạn có thể thay đổi chúng thành kiểu mới hay không. Nếu không, hãy sử dụng một .__ class__, nó cũng hoạt động với kiểu cũ. @ kindall của câu trả lời ám chỉ đến điều này đã nhưng tôi nghĩ rằng tôi sẽ giải nén này gotcha nhiều hơn một chút cho mọi người. –

1

Đó là bởi vì rằng các cá thể lớp kiểu cũ là tất cả InstanceType, trong Python 3.x chỉ có n các lớp kiểu ew, giống như các kiểu. Vì vậy, một sẽ là loại A trong Python 3.x. Sau đó, không cần phải bao gồm InstanceType, vì vậy nó không tồn tại nữa.

13

Câu hỏi của bạn có một chút không rõ ràng. Bạn muốn xác định "loại cá thể lớp". Điều này có thể có nghĩa là hai điều. Hoặc bạn muốn xác định là một cá thể là một cá thể của một lớp cụ thể. Bạn có thể làm điều đó như sau:

>>> isinstance(a, A) 
True 

Bạn cũng có thể nhận lớp với type() cuộc gọi, nhưng mà nói chung là không phải là rất hữu ích:

>>> type(a) 
<class '__main__.A'> 

Nhưng các xét nghiệm bạn hiển thị không kiểm tra này . Thay vào đó, họ kiểm tra loại lớp là gì. Nhưng Python 3 chỉ có một loại lớp. Python 2 và cả hai lớp "kiểu cũ" và "kiểu mới", nhưng Python 3 chỉ có các lớp kiểu mới, do đó không cần phải thực hiện kiểu kiểm tra này bằng Python 3.

Bạn cũng có thể sử dụng metaclasses. Trong trường hợp đó, bạn có thể tìm thấy những metaclass bằng cách kiểm tra các lớp của __class__:

>>> from abc import ABCMeta 
>>> class B(metaclass=ABCMeta): pass 
>>> type(B) 
<class 'abc.ABCMeta'> 

Từ ý kiến ​​của bạn, tuy nhiên, có vẻ như bạn muốn để xác định xem một đối tượng là một thể hiện hay không. Bạn sẽ có được câu trả lời tốt hơn nếu bạn hỏi rằng thay vào đó ...

Dù sao, để làm điều đó bạn sử dụng inspect.isclass:

>>> import inspect 
>>> inspect.isclass(a) 
False 
>>> inspect.isclass(A) 
True 

Điều này là do tất cả mọi thứ là một ví dụ:

>>> isinstance(type, type) 
True 

Nhưng không phải tất cả mọi thứ là một lớp.

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