2012-02-09 30 views
5

Tôi có một metaclass:metaclass lỗi: Loại .__ init __() mất 1 hoặc 3 đối số

class MyMeta(type): 
    def __init__(cls, name, bases, dct): 
     # Do something 
     ... 

     return super(MyMeta, cls).__init__(cls, name, bases, dct) 

và một lớp:

class MyClass(object): 
    __metaclass__ = MyMeta 

Khi tôi sử dụng những tôi nhận được lỗi sau:

E  TypeError: Error when calling the metaclass bases 
E   type.__init__() takes 1 or 3 arguments 

Vấn đề là gì và tại sao type.__init__() lấy số lượng đối số chính xác thay đổi?

Trả lời

8

Vấn đề là khi nâng cấp từ trăn 2.5 lên trăn 2.6 type.__init__() đã được thay đổi để bạn không còn cần phải vượt qua trong cls. Vì vậy, chỉ cần thực hiện các super gọi:

return super(MyMeta, cls).__init__(name, bases, dct) 

Một giải pháp khác là để tránh super cuộc gọi hoàn toàn và thực hiện điều này (mặc dù đó là một chút ít thoải mái):

return type.__init__(cls, name, bases, dct) 

Và mọi thứ sẽ hoạt động tốt (trong python > = 2.6).

Vì sao type.__init__() có thể nhận số lượng đối số khác nhau, hãy xem the documentation. Đó là do đó cũng như sử dụng nó như là một nhà xây dựng, bạn có thể gọi type(myobject) và nó sẽ trả về kiểu của myobject:

>>> number = 1 
>>> type(number) 
<type 'int'> 
>>> type('my string') 
<type 'str'> 

Xem What is a metaclass in Python? để biết thêm thông tin về metaclasses và loại.

+3

Lưu ý rằng 'siêu (MyMeta, cls) .__ init __ (tên, cơ sở, dct)' là cách * đúng * để thực hiện việc này, ngay cả trong 2.5 (và ngược lại là 2.2.) Trường hợp duy nhất bạn vượt qua 'cls' như là đối số đầu tiên là với' __new__', không phải với '__init__' (và điều đó cũng không cụ thể đối với' type' hoặc metaclasses.) Điều gì đã thay đổi là 'type .__ init __()' ngừng các ngoại lệ, giống như 'object .__ init __()'. –

+2

@ julio.alegria http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ –

+0

@HarleyHolcombe Tôi biết rằng trả lời câu hỏi của bạn được cho phép, nhưng ... 30 giây? Nó có nghĩa là câu trả lời đã sẵn sàng ngay cả trước khi bạn đăng câu hỏi, đó là điều lạ lùng – juliomalegria

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