2010-12-10 3 views
1

это связано с python, dynamically implement a class onthefly.python, динамически реализовать класс onthefly

, когда я перезагрузил свой компьютер, не смог вернуться, чтобы добавить комментарии к сообщению - ниже пример, чтобы объяснить, что означает сохранить class_with_the_methods_used

class bank(object): 
    def __init__(self, bal=0): 
     self.bal = bal 
    def deposit(self, amount): 
     self.bal+=amount 
     print self.bal 

def debit(self, amt): 
    self.bal-=amt 
    print self.bal 

bank.debit = debit 

myacct = bank() 
myacct.deposit(1000) # prints 1000 
myacct.debit(99) # print 901 

dir(myacct) # print [ ....'bal', 'debit', 'deposit'] 

тогда я использовал рассол и сохранил объект myacct

после сохранения, перезагрузки моего питона и попытались команды ниже

>>> import pickle 
>>> obj = pickle.load(open('bank.pkl')) 
>>> dir(obj) # prints [....'bal', 'deposit'] 

отмечает, что «дебет» не входит в числе атрибутов. Поэтому моя проблема заключается в том, как сделать такие методы, как «дебет» постоянным?

+2

Почему вы пытаетесь это сделать? Что плохого в определении класса «Банк» должным образом для начала? – 2010-12-10 12:54:59

+0

Что касается возможности добавления комментариев к предыдущему сообщению, я предлагаю вам зарегистрироваться в StackOverflow, чтобы у вас была учетная запись с связанными вопросами. – martineau 2010-12-10 15:34:17

ответ

1

Отъезд new модуля (http://docs.python.org/library/new.html)

Она имеет много инструментов для ведения дел динамически. Проблема, с которой вы сталкиваетесь, - это дебит, а не метод экземпляра, это просто нормальная функция. Методы, определенные в классах, отличаются от функций, определенных снаружи.

1

Это связано с тем, что pickle выбрасывает пользовательские классы.

>>> class Bank(object): 
...  pass 
... 
>>> def debit(self, amt): 
...  print amt 
... 
>>> Bank.debit = debit 
>>> 
>>> acct = Bank() 
>>> acct.debit 
<bound method Bank.debit of <__main__.Bank object at 0x023B57D0>> 
>>> import pickle 

Посмотрите на следующее:

>>> print pickle.dumps(acct) 
ccopy_reg 
_reconstructor 
p0 
(c__main__ 
Bank 
p1 
c__builtin__ 
object 
p2 
Ntp3 
Rp4 
. 

Вы увидите, что на самом деле весь экземпляр не маринованные; вместо этого pickle просто записывает, что это экземпляр Bank и воссоздает его, повторно создавая Bank. Вам нужно будет определить собственный протокол pickle, если вы хотите сделать это правильно, что сложно.

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