7

Trong Python, các hàm như str(), int(), float(), v.v. thường được sử dụng để thực hiện chuyển đổi loại. Tuy nhiên, những điều này yêu cầu bạn phải biết tại thời điểm phát triển loại bạn muốn chuyển đổi. Một bài toán con của một số mã Python mà tôi đang cố gắng viết như sau:Phản ánh và loại chuyển đổi Python

Cho hai biến, foobar, tìm loại foo. (Nó không được biết tại thời điểm phát triển, vì đây là mã chung.) Sau đó, cố gắng chuyển đổi bar thành bất kỳ loại foo nào. Nếu điều này không thể được thực hiện, hãy ném một ngoại lệ.

Ví dụ: giả sử bạn gọi hàm thực hiện điều này conv. chữ ký của mình sẽ như thế nào

def conv(foo, bar) : 
    # Do stuff. 

Nó sẽ được gọi là một cái gì đó như:

result = conv(3.14, "2.718") # result is now 2.718, as a float. 

Trả lời

11

Sử dụng foo.__class__ để có được những loại foo. Sau đó, gọi nó là để chuyển đổi thanh để loại foo:

def conv(foo, bar) : 
    return foo.__class__(bar) 

Tất nhiên, điều này chỉ hoạt động nếu loại foo có một constructor mà biết làm thế nào để chuyển đổi thanh.

+0

Ấn tượng. Tôi đã không bao giờ nghĩ rằng nó sẽ là vô cùng dễ dàng. Cũng đáng ngạc nhiên (tôi mới sử dụng Python và được sử dụng để gần gũi hơn với các ngôn ngữ kim loại) là nó hoạt động với nội trang. – dsimcha

+0

Không chính xác một phần. foo .__ class__ chỉ là loại foo nếu foo là một đối tượng kiểu mới. Nếu không, nó chỉ là lớp. –

+0

Chỉ inasmuch không chính xác tôi đã nói 'loại' khi lớp học sẽ chính xác hơn. Nhưng anh ta cần lớp học để chuyển đổi này. Và trong Python 3, sự khác biệt là đi anyway. – oefe

16

rằng sẽ là tốt nhất:

type(foo)(bar) 
+0

Chỉ trong Python 3.0. Trong Python 2.x, điều này sẽ chỉ hoạt động đối với "các lớp kiểu mới" và các nội trang dựng sẵn. – oefe

0
type(foo) 

chắc chắn là tốt nhất, nếu bạn muốn kiểm tra một loại sau đó "gõ" là phương pháp tốt nhất, và tôi đang trên python 2.7 - 3.2.2, type() tác phẩm hoàn hảo.

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