0

何時間も読んで疲れ果てたにもかかわらず、selfとinitが何をするのかまだわかりません。私はついにそれが何をするのかを理解しようとすることをあきらめ、代わりにそれを自分のコードに含める必要があることを知っていました(実際、それが必要かどうかさえわかりません)。

いずれにせよ、このことを学ぶために、チュートリアルで見つけたサンプルプログラムを取り上げ、サンプルを参照せずに自分で複製しようと決めました。

私はこれを完全に間違っているかもしれませんが、私がやろうとしているのは、ボタンが押されたときに呼び出されて新しい患者レコードを作成する機能を持つことです。私が立ち往生している部分は、これらの変数 (属性または変数と呼ばれますか?) をボタン プレス関数から患者クラスに渡す方法です。その関数をそのクラス内のメソッドとして配置するだけですか? また、ボタンを押すたびに新しい患者を作成できる方法はありますか?

  def buttonpress():
      name = input("what's your name")
      age = input("what's your age")
      totalpatients +=1


  class patients:
      def __init__(self, name, age):
      self.name = name
      self.age = age

def displaypatient(self):
      print self.age, self.name

firstpatient=patients(name, 16)
firstpatient.displaypatient()
4

3 に答える 3

1

基本的なオブジェクト指向プログラミングを使用しようとしていますが、クラスがオブジェクトを定義し、プロパティを持っていることを理解する必要があります。

以下のコードでは、Patient クラスを定義しています。

class Patient:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def display(self):
        return "%s - %s"%(self.age, self.name)

これには__init__、クラスから新しいオブジェクトを初期化するときに呼び出されるメソッドとして Python によって定義されたメソッドが呼び出され、いくつかのパラメーターがあります。

  • self - 作成しているオブジェクトへの参照であり、ここでは説明しません。しかし今のところ、オブジェクト メソッドに渡される最初のパラメーターはそれ自体への参照であることを理解しておいてください。
  • name - 私たちが定義する患者の名前
  • age - 我々も定義する年齢

2 番目のメソッドは、オブジェクトに対して呼び出して、出力したい方法を返すメソッドです。

以下に、患者を作成し、表示メソッドからその表現を出力するコードを示します。

firstpatient=patients(name, 16)
print firstpatient.display()

以下は、後の段階で作業するために患者の配列を作成するために使用できるコードのセクションです。

patients = [] # make an array with nopatients.
def getAnotherPatient():
    name = input("what's your name")
    age = input("what's your age")
    patients.append(Patient(name,age)) # Add a new patient
while somecondition:
    getAnotherPatient()

配列内に患者のリストを作成したら、patientsその中のオブジェクトをループして、通常どおりに操作または表示できます。

于 2013-09-10T05:48:17.980 に答える
0

クラスは基本的に、データ (属性) と、そのデータを操作する関数 (メソッド) の集まりで構成されます。クラスの各インスタンスには独自のデータ コピーがありますが、メソッドは共有されます。

したがって、クラスのすべての*メソッドはクラスのインスタンスで動作するため、メソッドはどのインスタンスで動作しているかを知る必要があります。それselfが目的です --selfメソッドが動作しているインスタンスを意味します。

たとえば、次のようになります。

class House:
    def renovate(self):
        ''' Renovate a house, increasing its value. '''
        self.value += 10000

oldhouse = House() # make a House instance that has no attributes
oldhouse.value = 100000 # set an attribute of the House
mansion = House()
mansion.value = 10000000
oldhouse.renovate() # self will be set to oldhouse, so that oldhouse's value goes up
print oldhouse.value # prints 110000
print mansion.value # prints 10000000: it hasn't changed because renovate knew what it was operating on

さて、この例では.value、クラスの外に設定していることに注意してください。それは可能ですが (Python では、ほぼすべてのインスタンスに任意の属性を設定できます)、すべてのクラスに対してそれを行うのは面倒です。

ここで__init__出番です。これは特別な意味を持つメソッドです (したがって、2 つのアンダースコアが付いています)。この場合、それはクラスが作成されたときに呼び出されるメソッドです (新しいインスタンスを作成するために括弧でクラスを呼び出すとき)。inithere の略initialization: クラス属性を初期化する関数です。selfクラスを作成するときに、( を超える)引数が必要です。

したがって、例を次のように変更できます。

class House:
    def __init__(self, value):
        self.value = value # set attribute
    def renovate(self):
        ''' Renovate a house, increasing its value. '''
        self.value += 10000

oldhouse = House(100000) # make a House instance with the value set
mansion = House(10000000) # make another House instance with the value set
oldhouse.renovate()
print oldhouse.value # prints 110000
print mansion.value # prints 10000000

.value同じように動作しますが、いくらか良くなります (新しいを設定し続ける必要がないためHouse)。


* staticmethods と classmethods、および次のような特殊なケースを除く__new__

于 2013-09-10T06:19:02.537 に答える