2011-12-07 26 views
6
class ClassA: pass 
mytype = type(ClassA) 

Sử dụng mytype, làm thế nào để bạn tạo một thể hiện của ClassA?Tạo một cá thể, tôi đã có loại

Lưu ý rằng tôi KHÔNG tìm kiếm này là câu trả lời của tôi :)

instance = ClassA() 

Tôi biết rằng trong ví dụ này, đó là tất cả bạn cần làm nhưng giả sử rằng bạn có loại này (MyType) , bạn không biết gì về nó, và bạn cần tạo ra một thể hiện của nó.

Tôi đã thử gọi mytype() và nó trả về lỗi cho biết loại() nhận 1 hoặc 3 đối số. Tôi tưởng tượng các đối số này có thể liên quan đến bất kỳ đối số nào bạn muốn chuyển vào phương thức init của đối tượng đang được tạo.

Lưu ý: Tôi đã nhìn thấy một số câu hỏi được hỏi về cách tạo đối tượng được cung cấp cho một chuỗi đại diện cho tên đầy đủ của nó. Lưu ý rằng ở đây, tôi đã có một loại để nó có một chút khác biệt? Tôi nghĩ?

EDIT ... Tôi đã hy vọng rằng tôi có thể làm tương đương với mã Net sau:

class A {} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Type type = typeof(A); 

     // Given the type, I can create a new instance 
     object new_instance = Activator.CreateInstance(type); 
    } 
} 

tôi đã giả định rằng trong Python, gõ (ClassA) cho một cái gì đó mà tôi lại sau đó có thể sử dụng để tạo một thể hiện của ClassA. Có vẻ như tôi đã hiểu nhầm loại python.

+1

MyType = loại (ClassA) sẽ cung cấp cho bạn một đối tượng lớp. Tôi nghi ngờ đây không phải là ý của bạn. –

+0

Đó là những gì tôi có nghĩa là, tôi nghĩ :) Xem chỉnh sửa của tôi ở trên với ví dụ. Net nếu điều đó giúp làm rõ bất cứ điều gì. –

Trả lời

14

Nếu bạn sử dụng một lớp phong cách mới nó, điều này sẽ làm việc:

class ClassA(object): 
    pass 

o = ClassA() 
mytype = type(o) 
new_object = mytype() 
+0

Điều này khá gần với những gì tôi đang tìm kiếm. Cảm ơn! –

+1

... Nhưng dường như không phải nếu bạn ahve tham số trong '__init __()' – Basic

4

Câu hỏi này không có ý nghĩa. type(X) cho bạn biết loại X và giá trị trả lại không chứa thông tin về lớp spesific X, giống như cách type("abc"), là str, không chứa thông tin về chuỗi được sử dụng làm đối số.

Trừ khi lớp X có metaclass tùy chỉnh, câu trả lời sẽ luôn là type, vì đó là metaclass mặc định trong python. Trong trường hợp của bạn sau đó, mytype is type, nghĩa là, chúng là cùng một đối tượng.

Bạn có thể sử dụng type để kiểm tra kiểu của một đối tượng nếu bạn sử dụng một đối số, hoặc sử dụng ba đối số bạn có thể tạo ra một lớp động ,:

myclass = type('ClassB', (object,), {"class_attribute": 3.14}) 

Giả sử trong một khoảnh khắc mà mytype làm việc như bạn nghĩ rằng nó sẽ. Hãy nhớ rằng một thể hiện của một kiểu là một lớp, theo đúng cách mà một thể hiện của một lớp là một đối tượng. Vì vậy, trong cùng một cách (trừ các lớp đơn) ClassA() is not ClassA() (mỗi trường hợp là duy nhất), mytype() is not mytype() - tức là bạn sẽ nhận được một lớp khác nhau mỗi khi bạn khởi tạo loại. Vì vậy, bạn sẽ không nhận được ClassA. Để minh họa điểm với mã bạn có thể chạy:

>>> type('A', (object,), {}) == type('A', (object,), {}) 
False 

OP EDIT ĐÁP:

Lớp học trong python là "công dân hạng nhất", không giống như những gì bạn có trong ngôn ngữ biên dịch nhất.Điều này có nghĩa là bạn có thể vượt qua lớp học xung quanh trực tiếp; bạn không cần phải có tương đương typeof:

>>> class A(object): pass 
... 
>>> B = A 
>>> B() 
<__main__.A object at 0xb781138c> 
>>> def print_class_name(cls): 
...  print cls.__name__ 
... 
>>> print_class_name(B) 
A 

This bài viết chứa một lời giải thích tuyệt vời về cách type, object và phản đối trường hợp được kết nối trong python.

+0

Cảm ơn, đọc bài viết ngay bây giờ. –

3

Có thể nói là lazyr không thể thực hiện được với type. Có lẽ những gì bạn có thể sử dụng là một cái gì đó giống như

class ClassA: pass 
myclass = ClassA 
instance = myclass() 
Các vấn đề liên quan