2015-06-16 3 views
0

После сохранения в файле серийного объекта класса я хотел бы предоставить статический метод «Загрузить», который должен снова открыть файл, десериализировать объект и вернуть новый экземпляр.Серийный объект Instanstiate от статического метода

В классическом отношении я бы подошел к этой проблеме, перегрузив конструктор и передав все необходимые аргументы. Однако, это не является общим в Python, но один предпочел бы адаптировать следующий подход:

Python class setup for serialization without pickle

Как я десериализации объекта в статическом методе, нет «ЦБС» и теперь я понятия не имею, как управлять им. Короче говоря, я хочу иметь такое поведение:

x = Foo() # default constructor. All serializable data is created later on 
# working with x and creating data 
x.save("my_file.pkr") 
y = Foo.Load(x) 

load() функция выглядит следующим образом:

@staticmethod 
    def load(filename): 
     with open(filename, 'rb') as bin_object: 
      lst1 = pickle.load(bin_object) 
      lst2 = pickle.load(bin_object) 
      lst3 = pickle.load(bin_object) 
      lst4 = pickle.load(bin_object) 
      lst5 = pickle.load(bin_object) 

     # not possible as I already use the default constructor 
     return Foo(lst1, lst2, lst3, lst4, lst5) 

Может кто-нибудь раскрыть меня, как создать объект Foo в методе статической нагрузки? Я все еще хочу создавать «пустые» объекты, вызывая только Foo().

ответ

0

Вы вводите в заблуждение Java-способ делать что-то.

В Python есть и staticmethod, который не принимает никаких аргументов, и classmethod, который берет класс. Последнее - это то, что вы хотите.

И нет причин, по которым назначение атрибута должно выполняться в конструкторе или при инициализации вообще. Совершенно корректно и идиоматично назначать атрибуты после инициализации и извне экземпляра.

@classmethod 
def load(cls, filename): 
    with open(filename, 'rb') as bin_object: 
     ... 
    foo = cls() 
    foo.lst1 = lst1 
    foo.lst2 = lst2 
    ... 
    return foo 
+0

По-видимому, «load()» принимает один аргумент. Это ссылка на объект класса. Но какая ссылка делается при вызове «Foo.Load()»? – null

+0

Ссылка на 'Foo'. В классах Python, как и функции, являются первоклассными объектами. –

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