Python Forum
How to redefine object so that all user- objects have the necessary capabilities?
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
How to redefine object so that all user- objects have the necessary capabilities?
#1
When I used the pickle library, it turned out that it does not save the current values ​​of the class members (after recovery pickle fills them with the original values). Pickle save only current values of instance variables. Therefore, I wrote a class 'AbstractSavingObject', which implements saving, including the current values ​​of class variables. Now I want to give this opportunity to all my classes (for the ability to save in a dump all objects when an exception occurs) and do not want to write inheritance from 'AbstractSavingObject' everywhere.

How to do this?
Reply
#2
Could you post short code exemplifying what you're talking about?

Also, if you haven't heard already, pickle is typically considered a security hole, so you might want to consider JSON or something else for your serialization. That won't directly help you with saving class variable though, I suspect that's something you'll just have to do manually.
Reply
#3
Thank you for your interest!

import os, pickle
class A:
    b=2
    def __init__(self, value):
        self.c = value
    
if not os.path.exists('MyPicl.bin'):
    with open('MyPicl.bin', 'wb') as dump:
        old_a = A(1)
        old_a.__class__.b = 3
    
        print(old_a.b)
        print(old_a.__class__.b)
        print(old_a.c)
        pickler = pickle.Pickler(dump, pickle.HIGHEST_PROTOCOL)
        pickler.dump(old_a)
        
else:
    with open('MyPicl.bin', 'rb') as dump:
        unpickler = pickle.Unpickler(dump)
        new_a = unpickler.load()
        
        print(new_a.b)
        print(new_a.__class__.b)
        print(new_a.c)
If you run this code twice (completely closing the program after the first launch), the first time you get the output:
Output:
3 3 1
, and the second time:
Output:
2 2 1
I want write like this:
object.parents.append(MyClassForCorrectSaving)
class A(object):
    b=2
    def __init__(self, value):
        self.c = value
Reply
#4
(Feb-18-2019, 06:41 PM)micseydel Wrote: Could you post short code exemplifying what you're talking about?

Also, if you haven't heard already, pickle is typically considered a security hole, so you might want to consider JSON or something else for your serialization. That won't directly help you with saving class variable though, I suspect that's something you'll just have to do manually.

json has limitations:
a) tuple during serialization / deserialization transform into a list.
b) what happens with set- it's unknown.
c) dict keys should ONLY have the string / number type.

Therefore, this method does not allow writing arbitrary code.
Reply
#5
Apologies for taking a while to get back, things have been pleasantly busy.

I've looked a bit and I can't find any direct way to get what you want. If you don't mind sticking to Python literals instead of classes, ast.literal_eval might be worth taking a look at; assuming your objects are simple enough, you can just print them and then evaluate them with literal_eval when you read from a file.
Reply
#6
My decision:
class MyObject:
    def __init__(self):
        print('I'm here!')

__builtins__.object = MyObject
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Is there a library for recursive object creation using config objects johsmi96 0 1,823 May-03-2021, 08:09 PM
Last Post: johsmi96
  Player object wont recognize collision with other objects. Jan_97 3 2,660 Dec-22-2019, 04:08 PM
Last Post: joe_momma
  An Object of Objects? cebb 4 2,786 Jul-28-2019, 03:29 PM
Last Post: cebb
  Redefine __add__ for ints ihf 4 3,284 Jun-01-2019, 06:29 PM
Last Post: ihf
  error creating new object after loading pickled objects from file arogers 2 3,367 Feb-02-2019, 10:43 AM
Last Post: Larz60+
  AttributeError: 'NoneType' object has no attribute 'n' in list of class objects jdrp 4 5,695 Jun-19-2018, 02:44 PM
Last Post: jdrp

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020