2017-09-05 8 views
0

私は、Python3でオブジェクト指向プログラミングを学ぶためのシンプルな従業員システムに取り組んでいます。 私のスクリプトは期待通りに動作し、従業員辞書の保存と読み込みは除きます。 問題は私の辞書はこのコードの通常の辞書の原因ではありません: Employees[eid] = Employee(eName,eSalary,eAge) 私はこのデータベースをJSON Serializeableにしたいと思いますが、私はインターネット上でそれを見つけられませんでした。 (その基本TypeEroorけど...) https://gist.github.com/ShockvaWe/d82d89f767506c1ff682a4cc387d1597JSONシリアル化可能なPython3辞書スタイルオブジェクトマッピング

を、現在のコードで私のエラーメッセージは次のとおりです:

は、悲しいことに、スタックオーバーフローでシステムを追加するコードは、私は要旨に私のコードを貼り付けて私にガンを与えた 申し訳ありませんが、私は私のコードを貼り付けることを試みる私の2時間を無駄にするので私はmadを得る。編集および答えのためにありがとう。ここで

はコードです:その性質上

class Foo(object): 
    def __init__(self, arg): 
    self.arg = arg 

d = {'key1': Foo('some arg')} 
import json 

print json.dumps(d) 

を、Pythonのclassインスタンスが直列化可能ではありません。ここで

## -*- coding=<utf-8> -*- 
import json 
from json import JSONEncoder 
Employees = {} 
print(type(Employees)) 
class Employee(object): 
    'Common base for all employes' 
    empCount = 0 
    def __init__(self,name,salary,age): 
     self.name = name 
     self.salary = salary 
     self.age = age 
     Employee.empCount += 1 

    def displayCount(self): 
     print ("Total Employee : " , Employee.empCount , "\n") 

    def displayEmployee(self): 
     print("Name : ", self.name ," Salary : " , self.salary ," Age : " , self.age, "\n") 
print ("NEVER FORGET TO SAVE YOUR CHANGES ! \n") 
print ("Press s to save your work ! \n") 
print ("Press l to load database. \n") 
print ("Press x for adding employee \n") 
print ("Press y for show employee count \n") 
print ("Press z for display employee \n") 
print ("Press q for quitting. \n") 
while True : 
    st = input("->> : ") 
    if (st == "x"): 
     eid = input ("Id : ") 
     eName = input ("\nName : ") 
     eSalary = input ("\nSalary : ") 
     eAge = input ("\nAge : \n") 
     Employees[eid] = Employee(eName,eSalary,eAge) 
    if (st == "y"): 
     print("Total Employee Count : " , Employee.empCount) 
    if (st == "z"): 
     wantedId = input("Give the id : ") 
     Employees[wantedId].displayEmployee() 
    if (st == "q"): 
     exit() 
    if (st == "s"): 
     with open('myfile.json','w') as f: 
      json.dump(dict(Employees),f) 
    if (st == "l"): 
     with open('myfile.json') as f: 
      Employees = json.load(f) 
    if (st == 'f'): 
     print("roger dodger") 
+1

質問に答えるには、投稿しているウェブサイトを侮辱しないでください。あなたの投稿をより丁寧に編集することをお勧めします。 –

+0

質問を編集し、最後の段落を削除してください。その攻撃的であなたの質問に無関係です。もう一度編集してコードを挿入してください。あなたは知っています、多くの人々がこのサイトを使用し、よくフォーマットされた質問を書くことができます – ventiseis

答えて

0

はおそらくTypeErrorあなたが見ている再現少し例です。あなたは、クラス内のデータを必要とすると、一つの選択肢ではなく、クラスオブジェクトのインスタンス辞書を使用することです:

class Foo(object): 
    def __init__(self, arg): 
    self.arg = arg 

f = Foo('some arg') 
d = {'key1': f.__dict__} 
import json 

print json.dumps(d) 

結果:

{"key1": {"arg": "some arg"}} 

をデシリアライズするには、あなたはあなたの順序を使用することができますDBと、この新しいEmployeeオブジェクトを作成し、後でそれを「再構成」するとき、あなたのJSONにこのトラックを手にする:

import json 

class Employee(object): 
    def __init__(self, arg, emp_id=None): 
    self.emp_id = emp_id or self.get_id() 
    self.arg = arg 

    def get_id(self): 
    """ 
    This example assumes you have a db query module and some kind of Sequence 
    definition that looks like this (I am using postgres here) : 

     Sequence "your_app.employee_id_seq" 
     Column  | Type |   Value   
    ---------------+---------+-------------------------- 
    sequence_name | name | employee_id_seq 
    last_value | bigint | 1204 
    start_value | bigint | 1 
    increment_by | bigint | 1 
    max_value  | bigint | 9223372036854775807 
    min_value  | bigint | 1 
    cache_value | bigint | 1 
    log_cnt  | bigint | 31 
    is_cycled  | boolean | f 
    is_called  | boolean | t 
    """ 
    return your_db_module.query("SELECT nextval('employee_id_seq'::regclass)") 

テスト:

こと
f = Employee('some arg') 
d = {f.emp_id: f.__dict__} 
# We could add as many employees as we like to serialized, but I am just using one here: 
serialized = json.dumps(d) 
deserialized_employees = json.loads(serialized) 
print deserialized_employees 
employee_objects = [] 
for k, v in deserialized_employees.items(): 
    # assert int(k) == int(v['emp_id']) - a check if you want to be paranoid 
    # Now that we have an ID, we can use the kwarg for emp_id to construct the right object 
    e = Employee(v['arg'], emp_id=int(k)) 
    employee_objects.append(e) 

print employee_objects[0] 

結果:あなたはこの電流であるため、emp_id独自のユニークな従業員の決定的な特徴であることを可能にするために、カスタム__cmp__および/または__eq__メソッドを定義する必要があること

<__main__.Employee object at 0x10dca6b50> 

は注意状態では、単一のID(通常は悪いもの)を使用して、同じ従業員の多くのインスタンスを作成することは技術的に許可されています。それがあなたのケースでは有効かどうかは分かりませんが、検討する価値があります。

+0

はい、しかし、あなたはどのように正しいオブジェクトにこれを逆直列化するのですか? –

+0

これはDBに関連しているので、私はEmployeeの一意の識別子として機能する自動インクリメントシーケンスを提案し、各オブジェクトの初期化に渡し、後でそれをデシリアライズするための基礎として使用します。あなたは単にあなたが持っている言葉に基づいて従業員を構成することができます。 – JacobIRR

+0

デシリアライズもできますか? –

関連する問題