2017-03-19 3 views
0

Ich versuche derzeit einfache Python-Klasse Beispiel. Ich habe eine Elternklasse (Person) und eine Unterklasse (Kontakt).Neues Objekt wird von vorherigem Objekt überschrieben

Ich instanziiere die Kindklasse zweimal mit verschiedenen Objekten c1 und c2. Das c2 ersetzt das c1. Was mache ich falsch ?

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

Hier ist das Beispiel für die Ausgabe der letzten 2 c1.detail() und 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 
################################################# 

Ich glaube es sein sollte:

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 
################################################# 

ich Spinnen bin mein Kopf herum und versucht herauszufinden, was falsch läuft. Wenn ich die Elternklasse verwende, funktioniert sie glatt (das Verhalten wie vorhergesagt, d.h. unterschiedliche Daten). Aber ich habe Schwierigkeiten zu verstehen, warum die Unterklasse sich so verhält? Vermisse ich etwas?

UPDATE

, was ich zu erreichen versuche, ist:

Ich werde einige Klassen und jede Klasse ihre einzigartige Felder haben, das heißt forexample Adresse für Adressnamen. Wie kann ich das erreichen, ohne das Feldwörterbuch zum Eltern hinzuzufügen? Beispiel

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

Vielen Dank Jungs, Dies funktioniert,

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

Antwort

1

name, id, fields sind Klassenmitglieder und daher werden neue Werte nicht instanziiert, wenn Instanzen von Contact, die von Person erben, vorgenommen werden.

Was Sie tun möchten, ist für jede neue Instanz von Kontakt erstellen Sie eine neue Gruppe von Eigenschaften Name, ID, Felder.

Der folgende Code tut das. Achten Sie auf, wie es definiert id, name, Felder zu sein, um eine der Instanz hinzufügen, wenn es (in der __init__ Funktion) paraphiert wird

Da jede Person Namen hat, id, Felder, die ich nicht, sie in initiieren müssen die Kontakt Klasse auch. Siehe die Definition der Contact-Klasse für eine sauberere Implementierung der Vererbung.

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

Ich habe einige Änderungen vorgenommen, und es scheint zu funktionieren. Hast du irgendwelche Vorschläge? Ist das die richtige Art, Suffs zu machen? –

1

Dies ist, weil Sie Klassenvariablen anstelle von Instanzvariablen verweisen. Von der docs:

Generell Instanzvariablen für die Daten einzigartig für jede Instanz und Klassenvariablen sind für Attribute und Methoden, die von allen Instanzen der Klasse geteilt sind:

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

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

Stattdessen Sie wie folgt könnten Ihre Klassen schreiben:

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 ... 
+0

Vielen Dank. Im Allgemeinen sind Instanzvariablen für Daten, die für jede Instanz eindeutig sind, und Klassenvariablen sind für Attribute und Methoden, die von allen Instanzen der Klasse gemeinsam genutzt werden. Prost :) –

+0

Die Sache ist, ich möchte den Zeitstempel auf erstellen und aktualisieren, aber wenn es keine Init gibt, werden die Werte nicht aktualisiert. Irgendwelche Vorschläge ? –

Verwandte Themen