3

実行時にオブジェクトを作成する場合、OOP の概念を理解するのに問題があります。私が調べたすべての教育コードは、「Bob」などの特定の変数をまだ定義しており、それらを新しいオブジェクト インスタンスに割り当てています。ボブ=人()

今理解に苦しんでいるのは、実行時に新しいオブジェクトを作成するモデルをどのように設計するかということです。すべてのオブジェクトは実行時に生成されるため、私の言い回しがおそらく間違っていることは承知していますが、端末または UI でアプリケーションを起動する場合、新しいオブジェクトを作成して管理するにはどうすればよいかということです。その場で新しい変数名を本当に定義することはできませんよね?

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

OPP モデルの理解が不十分であることをお許しください。私は現在、クラスと OOP について読んでいますが、先に進む前に自分のエラーが何であるかを理解する必要があると感じています。明確にするべきことがあれば教えてください。

4

5 に答える 5

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)
于 2011-01-18T16:39:51.607 に答える
2

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

オブジェクトのコレクションが必要な場合は、コレクションのみを使用します。それぞれインデックスまたはキーによって参照される、オブジェクト インスタンスを含むリストまたはディクショナリのいずれかを使用します。

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

于 2011-01-18T16:41:26.947 に答える
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()

では、データベースから人を取得したいとします。

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

これは基本的な大まかな例ですが、私が言っていることは理解できると思います。

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

于 2011-01-18T16:54:11.010 に答える
1

あなたの例では、モデルの抽象化を使用したいと考えています。

がモデル クラスの場合Personは、次のように簡単に実行できます。

person = new Person()
person.name = "Bob"
person.email = "bob@aol.com"
person.save()  # this line will write to the persistent datastore (database, flat files, etc)

その後、別のセッションで次のことができます。

person = Person.get_by_email("bob@aol.com") # assuming you had a classmethod called 'get_by_email'
于 2011-01-18T16:41:25.443 に答える
0

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

于 2011-01-18T17:06:34.683 に答える