2017-03-19 4 views
0

私は現在、単純なPythonクラスの例を試しています。私は親クラス(人)とサブクラス(連絡先)を持っています。新しいオブジェクトが以前のオブジェクトによって上書きされています

異なるオブジェクトc1とc2で子クラスを2回インスタンス化します。 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 
################################################# 

私は回転しています間違っていることを理解しようとするのが私の頭です。親クラスを使用すると、スムーズに動作します(予測通りの動作、つまり異なるデータ)。しかし、なぜサブクラスがこのように動作しているのか理解しようとするのが難しいですか?私は何かを逃していますか?私が達成しようとしています何

UPDATE

は次のとおりです。

私はさらにいくつかのクラスを持つことになりますし、各クラスが独自のフィールド、アドレス名のアドレスforexampleすなわちを持っています。どのように私は親にフィールド辞書を追加せずにこれを達成することができますか? 例

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() 

答えて

1

nameidfieldsはクラスメンバーなので、Personから継承されたContactのインスタンスが作成されると、新しい値がインスタンス化されません。

連絡先の新しいインスタンスごとに、新しいプロパティセットname、id、fieldsを作成します。

以下のコードはそうです。 id、name、フィールドを定義する方法に注意してください(__init__関数内)

すべての人が名前、ID、フィールドを持っているので、私はそれらを開始する必要はありません 連絡先クラスも同様です。継承のクリーナー実装 については、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() 
+0

私はいくつかの変更を加えましたが、うまくいくようです。何か提案はありますか ?これは正しい方法ですか? –

1

、取り組んでいます。 docsから:

一般的にインスタンス変数は、各インスタンスに固有のデータとクラス変数のためのものである、スピーキングクラスのすべてのインスタンスで共有属性とメソッドのためのものです:

代わり
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 ... 
+0

ありがとうございました。一般に、インスタンス変数は各インスタンスに固有のデータ用であり、クラス変数は属性のためのものであり、クラスのすべてのインスタンスによって共有されたメソッドが十分に説明されています。乾杯:) –

+0

ものは私が作成し、更新時にタイムスタンプを書きたいですが、initがない場合、値は更新されません。助言がありますか ? –

関連する問題