2013-05-07 35 views
8

Tôi có một lớp học như sau:Python: Làm thế nào để gọi một phương pháp dụ từ một phương pháp học cùng lớp

class MyClass(object): 
    int = None 
    def __init__(self, *args, **kwargs): 
     for k, v in kwargs.iteritems(): 
      setattr(self, k, v) 

    def get_params(self): 
     return {'int': random.randint(0, 10)} 

    @classmethod 
    def new(cls): 
     params = cls.get_params() 
     return cls(**params) 

và tôi muốn để có thể làm:

>>> obj = MyClass.new() 
>>> obj.int # must be defined 
9 

Ý tôi là không tạo ra một phiên bản mới của MyClass, nhưng rõ ràng nó không đơn giản như vậy, bởi vì gọi số MyClass.new() ném TypeError: unbound method get_params() must be called with MyClass instance as first argument (got nothing instead)

Có cách nào để thực hiện điều đó không? Cảm ơn

+4

Tại sao bạn không tạo 'get_params' một classmethod? – BrenBarn

+0

'MyClass' là một ví dụ,' get_params' đại diện cho một phương thức được gọi rộng rãi từ các phương thức ** instance ** khác trong lớp của tôi, và tôi nghĩ có cách nào đó để gọi nó từ classmethod thay vì thay đổi ALL các phương thức hiện đang gọi nó. Thanks anyway :) – Gerard

+2

'get_params' làm gì? Nếu đó là một phương thức thể hiện, bạn cần phải có một cá thể để gọi nó. Nếu bạn không, nó có lẽ không nên là một phương pháp dụ. Bạn có thể gọi một phương thức cá thể từ bất kỳ phạm vi nào khác, chỉ đơn giản bằng cách cung cấp một cá thể của lớp như một đối số đầu tiên rõ ràng. –

Trả lời

5

Không, bạn không thể và không nên gọi phương thức thể hiện từ một lớp học không có cá thể. Đây sẽ là rất xấu. Tuy nhiên, bạn có thể gọi, một phương thức lớp và phương thức thể hiện. Tùy chọn là

  1. làm get_param một phương pháp học và sửa chữa tài liệu tham khảo để nó
  2. __init__ gọi get_param, vì nó là một phương pháp dụ

Ngoài ra bạn có thể quan tâm đến một AttrDict vì đó trông giống như những gì bạn đang cố gắng làm.

+1

Lưu ý: Các lựa chọn đã cho không giải quyết được sự cố của tôi nhưng có thể hữu ích cho người khác. Chấp nhận vì lời giải thích rất rõ ràng tại sao bạn KHÔNG THỂ làm điều này :) – Gerard

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