如何在对象实例中保存当前状态?

时间:2018-11-02 09:38:58

标签: python

我想创建一个类,该类将具有一种重置其属性的方法,但是我需要将重置之前的数据保存到某个列表中。

我尝试了以下代码:

class Foo:
  feature1 = 'hey'
  feature2 = 10

  def reset(self):
      self.feature1 = None
      self.feature2 = None


some_list = []

foo = Foo()
print(foo.feature1)
print(some_list)
some_list.append(foo)
foo.reset()
print(foo.feature1)
print(some_list[0].feature1, some_list[0].feature2)

但是它打印出:

hey
[]
None
None None

有没有办法复制它?

4 个答案:

答案 0 :(得分:2)

我建议您尝试创建新实例而不是重置。并且还使属性成为实例的一部分,而不是类的一部分。

这样定义您的课程:

save_path = './keras-saves/_lastest.ckpt'
try:
    model.fit(x_train, y_train,
              batch_size=batch_size,
              epochs=epochs)
except KeyboardInterrupt:
    model.save(save_path)
    print('Output saved to: "{}./*"'.format(save_path))

然后运行以下行:

public static void sendHtmlEmail(String subject, String messages){

    try{
        String HOST = ...;
        final String USER = ...;
        final String PASSWORD = ...;
        String PORT = "587";
        String TO = ...;            
        String SUBJECT = "Test Mail";
        String TEXT = "This is a test message from my java application. Just ignore it";

        Properties props = System.getProperties();
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.localhost", HOST);
        props.put("mail.smtp.port", PORT);
        props.put("mail.smtp.auth",true);
        props.put("mail.smtp.starttls.enable", true);

        Authenticator auth = new Authenticator()
        {
            @Override
            protected PasswordAuthentication getPasswordAuthentication()
            {
                return new PasswordAuthentication(USER, PASSWORD);
            }
        };

        Session session = Session.getInstance(props,auth);

        session.setDebug(true);

        MimeMessage message = new MimeMessage(session);    
        message.setFrom(new InternetAddress(USER));
        message.addRecipient(RecipientType.TO, new InternetAddress(TO));
        message.setSentDate(new Date());
        message.setSubject(SUBJECT);
        message.setText(TEXT);
        message.saveChanges();

        Transport transport = session.getTransport("smtp");
        transport.connect(HOST, USER, PASSWORD);
        transport.sendMessage(message, message.getAllRecipients());           
        transport.close();  

    }
    catch(Exception e){
        e.printStackTrace();
    } 
}

您将获得以下输出:

class Foo:
    def __init__(self):
        self.feature1 = 'hey'
        self.feature2 = 10

    def __repr__(self):
        return '[{}|{}]'.format(self.feature1, self.feature2)

答案 1 :(得分:1)

您不应尝试重置实例,因为可能有很多对此实例的引用。相反,如果您需要一个新的对象,请创建一个新对象:

Database D;
D.add(myAgent.getLocalName);

输出:

class Foo:
    def __init__(self, feature1=None, feature2=None):
        self.feature1 = feature1
        self.feature2 = feature2


some_list = []

foo = Foo("hey", 10)
print(foo.feature1)
print(some_list)
some_list.append(foo)
foo = Foo()
print(foo.feature1)
print(some_list[0].feature1, some_list[0].feature2)

答案 2 :(得分:0)

在重置之前制作对象的副本,然后将副本附加到列表中而不是原始对象。

根据您的需求,使用深度复制是一种更好的方法,因为我认为您正在做快照或类似的事情。

答案 3 :(得分:0)

了解类属性和对象属性之间的区别。

feature1和feature2都是类属性。这意味着您可以以Foo.feature1和Foo.feature2的身份访问它们。

使用self.feature1时,是指对象属性。在您的情况下,如果没有将对象属性定义为Feature1,则由于继承,您将获得类属性。

另一方面,如果您使用与类属性相同的名称定义了对象属性,则使用self会给您对象属性,而不是类属性。如果要显式访问对象中的类属性,则应使用className.attribute,以Foo.feature1为例。