2011-01-18 6 views
3

実行時にオブジェクトを作成するときは、OOPの概念を理解するのに問題があります。私がまだ調べてきたすべての教育コードは、具体的な変数を定義しています。 'Bob'を呼び出し、それらを新しいオブジェクトインスタンスに割り当てます。 Bob = Person()Pythonでランタイム中にオブジェクトを作成する

私が今理解していないのは、実行時に新しいオブジェクトを作成するモデルを設計する方法です。ランタイム中にすべてのオブジェクトが生成されるので私の表現は間違っているかもしれませんが、ターミナルやUIでアプリケーションを起動する場合、新しいオブジェクトを作成して管理する方法があります。実際に新しい変数名を実際に定義することはできませんか?

私がこの設計上の問題に取り組むアプリケーションの例は、人を格納するデータベースになります。ユーザは、新しいユーザを作成し、名前、給与、位置を割り当てることを可能にする端末メニューを得る。どのようにオブジェクトをインスタンス化し、それを管理したり、関数などを呼びたい場合は、後で呼び出すのでしょうか?ここでデザインパターンは何ですか?

私のOPPモデルについてよく理解していないことをお詫び申し上げます。私は現在、クラスとOOPで読んでいますが、私は私のエラーがここに移動する前に理解する必要があるように感じる。明確にすべきことがあれば教えてください。リストや辞書などの

+0

なぜカスタム名を変数名にしたいですか? – SilentGhost

+0

実際にオブジェクトを作成することを理解しました。まず、リスト、セット、辞書などのコンテナについてもっと学ぶ必要があります。 –

+2

誰かがオブジェクトの「名前」を話すときはいつも、「錯覚のアイデア」タグを追加する強い衝動を感じます;)オブジェクトには名前がありません。変数があり、オブジェクトを参照します。しかし、それは1対1の関係ではなく、多くの変数は1つのオブジェクトを参照することができ、オブジェクトは変数によって参照される必要はありません。彼らは非常に異なったものです。 – delnan

答えて

7

物事は値/オブジェクトの動的に生成されたセットを格納するための素晴らしいです:あなたたとえば

class Person(object): 
    def __init__(self, name): 
     self.name = name 
    def __repr__(self): 
     print "A person named %s" % self.name 

people = {} 
while True: 
    print "Enter a name:", 
    a_name = raw_input() 

    if a_name == 'done': 
     break 

    people[a_name] = Person(a_name) 

    print "I made a new Person object. The person's name is %s." % a_name 

print repr(people) 
+1

すごくありがとう、ありがとう。 –

1

は、あなたがモデルの抽象化を使用します。

Personはモデルクラスである場合、あなたは、単に行うことができます:別のセッションで

person = new Person() 
person.name = "Bob" 
person.email = "[email protected]" 
person.save() # this line will write to the persistent datastore (database, flat files, etc) 

し、その後に、あなたは可能性:

person = Person.get_by_email("[email protected]") # assuming you had a classmethod called 'get_by_email' 
+0

参考にしていただきありがとうございます。私はそれがこのような何かになると思った –

2

変数名と各オブジェクトを保存しません。変数名は、プログラマの便宜のためのものです。

オブジェクトのコレクションが必要な場合は、コレクションだけを使用します。インデックスまたはキーでそれぞれ参照されるオブジェクトインスタンスを含むリストまたは辞書を使用します。

たとえば、各従業員に従業員番号がある場合、その従業員番号をキーとして辞書に保持することができます。

+0

私はすでにそれが事実になることを笑いを持っていた。説明のための感謝、非常に役立つ –

1

私はここに私ができるように最善をお答えしようとするでしょう:あなたがについて尋ねているもの

  1. は、変数の変数名である - これは、Pythonではありません。

(私はそれはVB.Netでありますが、その私を持っていないと思います)ユーザーは、彼が新しいユーザーを作成し、名前、給与、位置を割り当てることができ、端末のメニューを取得します。どのようにオブジェクトをインスタンス化し、それを管理したり、関数などを呼びたい場合は、後で呼び出すのでしょうか?ここでデザインパターンは何ですか?

これは、私は新しい人(ミッキー・マウスの一例)を追加したい方法です:あなたが今、データベースから人を取得したいので、

# Looping until we get a "fin" message 
while True: 
    print "Enter name, or "fin" to finish:" 
    new_name = raw_input() 
    if new_name == "fin": 
     break 
    print "Enter salary:" 
    new_salary = raw_input() 
    print "Enter position:" 
    new_pos = raw_input() 

    # Dummy database - the insert method would post this customer to the database 
    cnn = db.connect() 
    insert(cnn, new_name, new_salary, new_pos) 
    cnn.commit() 
    cnn.close() 

[OK]を。

while True: 
    print "Enter name of employee, or "fin" to finish:" 
    emp_name = raw_input() 
    if emp_name == "fin": 
     break 
    # Like above, the "select_employee" would retreive someone from a database 
    cnn = db.connect() 
    person = select_employee(cnn, emp_name) 
    cnn.close() 

    # Person is now a variable, holding the person you specified: 
    print(person.name) 
    print(person.salary) 
    print(person.position) 

    # It's up to you from here what you want to do 

これは単なる基本的な例ですが、私はあなたが何を意味するのかと思っています。

また、ご覧のとおり、クラスを使用していません。このようなもののクラスはもっと良いアイデアですが、これは実行時に変数をどのように変更して使用するかを示すためのものです。

0

実際のプログラムではBob = Person()を実行しません。間違いなく悪い例であることを示す例。本質的にハードコーディングです。より多くの場合(実際のコードで)person = Person(id, name)などを実行して、別の場所で取得したデータ(ファイルからの読み込み、ユーザーからのインタラクティブな受信など)を使用してオブジェクトを構築します。さらに良いものはemployee = Person(id, name)のようなものでしょう。

関連する問題