簡體   English   中英

新對象被先前的對象覆蓋

[英]New object is being overwritten by previous object

我目前正在嘗試簡單的python類示例。 我有一個父類(人)和一個子類(聯系人)。

我用不同的對象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()

這是最后2個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()

這是因為您引用的是類變量而不是實例變量。 文檔

一般來說,實例變量用於每個實例唯一的數據,而類變量用於類的所有實例共享的屬性和方法:

 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實例創建一組新的屬性名稱,id,字段。

下面的代碼可以做到這一點。 注意它是如何定義ID,名稱,在實例初始化時添加實例的字段的(在__init__函數中)

由於每個人都有姓名,ID和字段,因此我也不必在Contact類中啟動它們。 有關繼承的更清晰實現,請參見Contact類的定義。

#!/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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM