2016-08-09 3 views
0

Я хочу вернуть экземпляр класса в функции-члене класса, мой код:Как вернуть экземпляр класса в функцию-член класса?

class MyClass(object): 
    def __init__(self, *args, **kwargs): 
     [snippet] 

    def func(self, *args, **kwargs): 
     [snippet] 
     return class_instnace_of_MyClass 

if __name__ == '__main__': 
    obj = MyClass(...) 
    newobj = obj.func(...) # type(newobj) is MyClass 

Я думаю, что я могу назвать __init__() в func(), и возвращает новый экземпляр MyClass, но я не думаю, это питоновский способ сделать это. Как мне это сделать? Спасибо!

ответ

1

Мне кажется, что вы должны использовать декоратор @classmethod для этого, если я правильно читаю ваш вопрос. Что-то вроде:

class myClass(object): 

    def __int__(name): 
     self.name = name 

    @classmethod 
    def from_fancy(cls, name): 
     #do something with name, maybe make it 
     #lowercase or something... 
     return cls(name) 

Например, в pandas пакете вы можете создать DateFrame объект, делая такие вещи, как pandas.DataFrame.from_csv(...) или pandas.DataFrame.from_json(...). Каждый из них - это методы класса, которые возвращают объект DataFrame, созданный с использованием разных начальных наборов данных (текстовый файл csv или текстовый файл JSON).

Например, вы могли бы назвать это нравится:

my_new_object = myClass.from_fancy("hello world") 

Там хорошая нить на @classmethodhere

+0

ненужными, магия в @classicmethod будет заботиться о нем, по крайней мере, в Python 2.x , Не знаю о python 3.x – reptilicus

+0

@AlexanderYau вы ничего не делаете. Просто используйте код прямо там. Ничего больше. Добро пожаловать в простоту python, вам придется привыкнуть к ней. –

+0

@AlexanderYau убедитесь, что вам это действительно нужно: не можете ли вы просто расширить '__init__'? правильным способом создания объекта в python является использование '__init__'. все методы в python являются общедоступными –

2

__init__ является конструктором класса в Python. Ни в коем случае он ничего не возвращает, то есть его значение равно None. Бесполезно передавать аргумент func(), который пуст. Ваше предположение верно, то есть не питоновский способ создания другого экземпляра MyClass.

Если вы хотите создать новый экземпляр MyClass просто сделать это:

obj = MyClass(...) # First instance 
newobj = MyClass(...) # Add another instance 

Подробнее об объектах класса и их конкретизации here.

2

Чтобы return новый экземпляр из метода, экземпляр класса в методе, и возвращает этот новый экземпляр, например, так:

class MyClass(object): 
    def __init__(self, *args, **kwargs): 
     pass 

    def func(self, *args, **kwargs): 
     ... 
     return MyClass(...) 

if __name__ == '__main__': 
    obj = MyClass(...) 
    newobj = obj.func(...) 

Или вместо карусели, вы могли бы только newobj = MyClass(...)

Смежные вопросы