python, динамически реализовать класс на thefly - PullRequest
1 голос
/ 10 декабря 2010

это связано с python, динамически реализовать класс на thefly .

когда я перезапустил свой компьютер, я не смог вернуться, чтобы добавить комментарии к сообщению - ниже приведен пример, чтобы объяснить, что означает сохранение 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']

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

после сохранения перезапустил мой питон и попробовал команды ниже

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

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

Ответы [ 2 ]

1 голос
/ 10 декабря 2010

Это связано с тем, что 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.Вам нужно будет определить собственный протокол рассола, если вы хотите сделать это правильно, что сложно.

1 голос
/ 10 декабря 2010

Проверьте модуль new (http://docs.python.org/library/new.html)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...