新对象正被以前的对象覆盖

2024-04-25 05:03:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试简单的python类示例。我有一个父类(person)和一个子类(contact)

我用不同的对象c1和c2实例化子类两次。c2正在替换c1。我做错什么了

#!/bin/python3

import time
from time import sleep

class Person (object):
    id = 0
    name = None
    fields = {}

    def __init__(self):
        ctime = time.strftime("%Y-%m-%d %H:%M:%S")
        self.fields.update({"create_time":ctime,
                            "write_time" :ctime})
        Person.id+=1

    def check_keys (self,vals):
        for k in vals:
            if not k in self.fields.keys():
                raise Exception("Key %s doesnot exists"%k)

    def update(self,*args,**kwargs):
        vals = kwargs['vals']
        self.check_keys(vals)
        self.fields.update(vals)
        ctime = time.strftime("%Y-%m-%d %H:%M:%S")
        self.fields.update({"write_time":ctime})

    def write(self,*args,**kwargs):
        vals = kwargs['vals']
        self.check_keys(vals)
        self.fields.update(vals)

    def detail (self):
        print ("Model Name is ",self.name)
        for k,v in self.fields.items():
            print("key:",k," value:",v)
        print ("#"*50)

    def get_id(self):
        return self.id

class Contact (Person):
    name="contact"
    contact_id = 0
    fields = {
        'id':None,
        'name':None,
        'age':None,
    }

c1 = Contact()
c1.update(vals={'name':'sijan','age':31,'id':c1.get_id()})
sleep(1)
c1.update(vals={'name':'sijan Shs'})

print ("calling contact 2")

c2 = Contact()
c2.update(vals={'name':'Aurelia','age':32,'id':c2.get_id()})

print ("calling contact 1")
c1.detail()
print ("calling contact 1")
c2.detail()

下面是最后两个c1.detail()和c2.detail()的示例输出

calling contact 1
Model Name is  contact
key: id  value: 2
key: name  value: Aurelia
key: age  value: 32
key: create_time  value: 2017-03-19 15:35:54
key: write_time  value: 2017-03-19 15:35:54
##################################################
calling contact 2
Model Name is  contact
key: id  value: 2
key: name  value: Aurelia
key: age  value: 32
key: create_time  value: 2017-03-19 15:35:54
key: write_time  value: 2017-03-19 15:35:54
#################################################

我认为应该是:

calling contact 1
Model Name is  contact
key: id  value: 1
key: name  value: Sijan Shs
key: age  value: 31
key: create_time  value: 2017-03-19 15:35:53
key: write_time  value: 2017-03-19 15:35:54
##################################################
calling contact 2
Model Name is  contact
key: id  value: 2
key: name  value: Aurelia
key: age  value: 32
key: create_time  value: 2017-03-19 15:35:54
key: write_time  value: 2017-03-19 15:35:54
#################################################

我绞尽脑汁想弄清楚到底出了什么问题。如果我使用父类,它工作得很顺利(行为如预测的那样,即不同的数据)。但是我很难理解为什么子类会这样?我错过什么了吗

更新

我要达到的目标是:

我将有几个更多的类和每个类将有其独特的字段,即例如地址名称的地址。如何在不向父级添加字段字典的情况下实现这一点? 示例

class Address(Person):
    fields={
       'address':None
    }

谢谢大家, 这起作用了

#!/bin/python3

import time
from time import sleep

class Person (object):
    id = 0
    name = None
    fields = {}

    def __init__(self):
        ctime = time.strftime("%Y-%m-%d %H:%M:%S")
        self.fields.update({"create_time":ctime,
                            "write_time" :ctime})
        Person.id+=1

    def check_keys (self,vals):
        for k in vals:
            if not k in self.fields.keys():
                raise Exception("Key %s doesnot exists"%k)

    def update(self,*args,**kwargs):
        vals = kwargs['vals']
        self.check_keys(vals)
        self.fields.update(vals)
        ctime = time.strftime("%Y-%m-%d %H:%M:%S")
        self.fields.update({"write_time":ctime})

    def write(self,*args,**kwargs):
        vals = kwargs['vals']
        self.check_keys(vals)
        self.fields.update(vals)

    def detail (self):
        print ("Model Name is ",self.name)
        for k,v in self.fields.items():
            print("key:",k," value:",v)
        print ("#"*50)

    def get_id(self):
        return self.id

class Contact (Person):


    def __init__(self):
        self.name="contact"
        self.fields = {
            'id':None,
            'name':None,
            'age':None
        }
        super(Contact,self).__init__()


ca = Contact()
ca.update(vals={'name':'sijan','age':31,'id':ca.get_id()})
sleep(1)
ca.update(vals={'name':'sijan Shs'})
ca.detail()

cb = Contact()
cb.detail()
cb.update(vals={'name':'Aurelia','age':32,'id':cb.get_id()})

print ("calling contact 1")
ca.detail()
print ("calling contact 2")
cb.detail()

Tags: keynameselfidfieldstimevaluedef
2条回答

这是因为您引用的是类变量而不是实例变量。从docs

Generally speaking, instance variables are for data unique to each instance and class variables are for attributes and methods shared by all instances of the class:

class Dog:
    kind = 'canine'         # class variable shared by all instances

    def __init__(self, name):
        self.name = name    # instance variable unique to each instance

相反,您可以按以下方式编写类:

 class Person(object):
      self.id = 0
      self.name = None
      self.fields = {}

 # rest of the class ...

 class Contact (Person):
     self.name="contact"
     self.contact_id = 0
     self.fields = {
         'id':None,
         'name':None,
         'age':None,
     }

 # rest of the class ...

nameidfields是类成员,因此在创建从Person继承的Contact实例时,不会实例化新值

您要做的是为Contact的每个新实例创建一组新的属性name、id和fields

下面的代码就是这样做的。注意它如何定义id、name、字段,以便在初始化实例时添加实例(在__init__函数中)

因为每个人都有名字,身份证,字段,我不必启动他们 联系人类也是。请参见联系人类的定义 更干净的继承实现

#!/bin/python3

import time
from time import sleep

class Person (object):
    # id = 0
    # name = None
    # fields = {}

    def __init__(self):
        self.id = 0
        self.name = None
        self.fields = {
            'id':None,
            'name':None,
            'age':None,
        }

        ctime = time.strftime("%Y-%m-%d %H:%M:%S")
        self.fields.update({"create_time":ctime,
                            "write_time" :ctime})
        self.id+=1

    def check_keys (self,vals):
        for k in vals:
            if not k in self.fields.keys():
                raise Exception("Key %s doesnot exists"%k)

    def update(self,*args,**kwargs):
        vals = kwargs['vals']
        self.check_keys(vals)
        self.fields.update(vals)
        ctime = time.strftime("%Y-%m-%d %H:%M:%S")
        self.fields.update({"write_time":ctime})

    def write(self,*args,**kwargs):
        vals = kwargs['vals']
        self.check_keys(vals)
        self.fields.update(vals)

    def detail (self):
        print ("Model Name is ",self.name)
        for k,v in self.fields.items():
            print("key:",k," value:",v)
        print ("#"*50)

    def get_id(self):
        return self.id

class Contact (Person):
    def __init__(self):
        super(Contact, self).__init__()
        self.contact_id = 0


c1 = Contact()
c1.update(vals={'name':'sijan','age':31,'id':c1.get_id()})
# sleep(1)
c1.update(vals={'name':'sijan Shs'})

print ("calling contact 2")

c2 = Contact()
c2.update(vals={'name':'Aurelia','age':32,'id':c2.get_id()})

print ("calling contact 1")
c1.detail()
print ("calling contact 1")
c2.detail()

相关问题 更多 >