- object 志向って結局何?
- 独自のクラスを作ろう!?
- オブジェクトに関わる メソッドとステータス
- インスタンス化?
- クラスを呼び出すことで、オブジェクトを作る。=インスタンス???
- instance variables
- クラス内のdef __init__():はメソッド。
- 初めて正解した。
- クラス内の関数のargumentはself??
- クラス内関数の使い方は__init__ならクラス名、それ以外はクラス内の関数名をクラスが生成したオブジェクトにattributeさせる。
- クラスが生成したオブジェクトに対してattributeするメソッド(関数ではない)を作る。dot notationで呼び出す。
- 同じ結果だが、クラスの外で関数(メソッドではない)を作るとこうなる。 standalone functionで呼び出す。
- __str__メソッドでクラス生成オブジェクトのパラメター(instance)をstringとしてみる。
- Special (dunderscore) Methodsの一つに__add__がある。
- returnとしてオブジェクトを返す(valueとしてオブジェクトをreturnする)
- クラス生成オブジェクトをソートするときkey=関数名で()はいらない
- Class variable は初期値????20.10. Class Variables and Instance Variables クラス内メソッドを使用したとき、最後にclass variableを読み込む?
- クラスの使い方 20.11. Thinking About Classes and Instances
- テスト
object 志向って結局何?
メソッドとは、クラスのファンクションである。
メソッドはファンクションと違ってargumentが一つだけらしい。
Pythonでは、すべての値は、実際にはオブジェクトです。辞書であろうと、リストであろうと、整数であろうと、すべてオブジェクトです。プログラムは、これらのオブジェクトに対して計算を実行したり、メソッドの実行を求めたりして、オブジェクトを操作します。具体的には、オブジェクトはステートと実行可能なメソッドの集合を持つと言います。(オブジェクトの状態とは、そのオブジェクトが自分自身について知っていることを表します。状態はインスタンス変数に格納されます。例えば、turtleオブジェクトで見てきたように、それぞれのturtleは、turtleの位置、色、方向などからなる状態をもっています。
え?クラスだったの?
str、int、float、listといったクラスはすでに見てきました。
独自のクラスを作ろう!?
オブジェクトに関わる メソッドとステータス
あるオブジェクトが平面座標状の点を表すとき、ステータスはx, y 座標、メソッドはx座標の取得、y座標の取得、となる。
クラス定義はプログラムのどこにでも記述できますが、通常は冒頭付近(import文の後)に記述します。クラス定義の構文ルールは、他の複合ステートメントと同じです。キーワードclassで始まるヘッダーがあり、その後にクラス名が続き、コロンで終わります。
すべてのクラスは、特別な名前 __init__ を持つメソッドを持つ必要があります。この初期化メソッドはコンストラクタと呼ばれることが多く、Point の新しいインスタンスが作成されるたびに自動的に呼び出されます。このメソッドによって、プログラマは新しいインスタンスに必要な属性に初期値を与え、セットアップを行うことができます。self パラメータ(他の名前も使用できますが、誰も使用しません!)には、初期化 が必要な新しく作成されたオブジェクトを参照するように自動的に設定されま す。
インスタンス化?
クラスは、オブジェクトを作るための工場と考えるとわかりやすいかもしれません。クラス自体は点のインスタンスではありませんが、点のインスタンスを作成するための機械が含まれています。コンストラクタを呼び出すたびに、工場に新しいオブジェクトを作るように依頼することになります。オブジェクトが生産ラインから出てくると、初期化メソッドが実行され、工場のデフォルト設定でオブジェクトが適切にセットアップされます。
この「新しいオブジェクトを作る」と「そのオブジェクトの設定を工場出荷時の設定に初期化する」を合わせた処理を「インスタンス化」と呼びます。
クラスを呼び出すことで、オブジェクトを作る。=インスタンス???
クラスを呼び出すとインスタンス(オブジェクト)ができるらしい。
確かにobjectであるらしい。
instance variables
これじゃわかりません。
これですね。

class Student:
def __init__(self, name, age): #instance variablesはnameとage
self.name = name #self.name を name で置き換える
self.age = age
s1 = Student(‘John’, 18)
s2 = Student(‘Tim’, 70)
print(s1.name)
print(s2.name)
class Fruit:
def __init__(self, color, taste):
#必ずself.color = color と書かないとerror出る。
self.color = color
f1 = Fruit(“yellow”, “sweet”)
print(f1.color)
は?
クラス内のdef __init__():はメソッド。
initXはvalue?
self.colorはvariables?
メソッドは関数と同じように振る舞いますが、特定のインスタンスに対して呼び出されます。たとえば、変数Lにリストが束縛されている場合、L.append(7)は、リスト自身を第1引数、7を第2引数として、関数appendを呼び出す。メソッドへのアクセスはドット記法で行う。このため、L.append(7)には1つしかないと思っていても2つのパラメータがあります。変数Lに格納されているリストが最初のパラメータ値で、7が2つ目のパラメータです。
つまりself.colorのselfはパラメター?
class Bike:
“”” Point class for representing and manipulating x,y coordinates. “””
# constructor method によりBikeオブジェクトのvariablesを定義
def __init__(self, initX, initY):
#instant variable initX に メソッドself.colorをassign
self.color = initX # colorメソッドが使われた場合initXをreturnする。
self.price = initY
testOne = Bike(‘blue’,89.99)
testTwo = Bike(‘purple’,25.0)
#testOneというBikeクラスオブジェクトに付与された値のうち、
#initXを指定するためのメソッドtestOne.color
print(testOne.color)
初めて正解した。
class NumberSet:
def __init__(self, num1, num2):
self.num1 = num1
self.num2 = num2
t = NumberSet(6, 10)
クラス内の関数のargumentはself??
クラス内の関数はクラスから生成されたオブジェクトをパラメーターとしたメソッドとして使用される?
class Animal:
def __init__(self, arms, legs):
self.arms = arms
self.legs = legs
self.limbs = arms + legs
spider = Animal(4, 4)
spidlimbs = spider.limbs
print(spidlimbs)
クラス内関数の使い方は__init__ならクラス名、それ以外はクラス内の関数名をクラスが生成したオブジェクトにattributeさせる。
class Animal:
def __init__(self, arms, legs):
self.Arms = arms
self.Legs = legs
def limbs(self): #selfを抜くとerror
return self.Arms + self.Legs
#return arms + legs とするとerror
spider = Animal(4, 4) #spiderはAnimalクラスのオブジェクト
spidlimbs = spider.limbs()
print(spidlimbs)
クラスが生成したオブジェクトに対してattributeするメソッド(関数ではない)を作る。dot notationで呼び出す。
import math
class Point:
“”” Point class for representing and manipulating x,y coordinates. “””
#クラスが生成するオブジェクトが2つのパラメーターを持つという宣言。
def __init__(self, initX, initY):
self.x = initX
self.y = initY
#クラスが生成するオブジェクトの2つのパラメターを取得するクラス内関数
def getX(self):
return self.x
def getY(self):
return self.y
def distanceFromOrigin(self):
return ((self.x ** 2) + (self.y ** 2)) ** 0.5
#関数のargumentとしてpoint2をset、attributeとしてpoint1をセット。
def distance(self, point2):
xdiff = point2.getX()-self.getX()
ydiff = point2.getY()-self.getY()
dist = math.sqrt(xdiff**2 + ydiff**2)
return dist
p = Point(4,3)
q = Point(0,0)
print(p.distance(q))
同じ結果だが、クラスの外で関数(メソッドではない)を作るとこうなる。 standalone functionで呼び出す。
ほとんどのプログラマは、関数をスタンドアロンにするか、クラスのメソッドにするかは、意味的にその関数がクラスのインスタンスに対して行われる操作に見えるかどうかで判断します。この場合、距離は2つの点の特性であり、対称であるため(aからbへの距離とbからaへの距離は同じ)、メソッドではなくスタンドアロン関数にする方が理にかなっている。このようなスタイルの決定については、プログラマーの間で多くの熱い議論が交わされてきた。
__str__メソッドでクラス生成オブジェクトのパラメター(instance)をstringとしてみる。
class Point:
“”” Point class for representing and manipulating x,y coordinates. “””
def __init__(self, initX, initY):
self.x = initX
self.y = initY
def getX(self):
return self.x
def getY(self):
return self.y
def distanceFromOrigin(self):
return ((self.x ** 2) + (self.y ** 2)) ** 0.5
#クラス生成オブジェクトpのパラメターが知りたい場合、__str__メソッドを使う
#__str__を使わないと<__main__.Point object>がprintされる。
def __str__(self):
return “x = {}, y = {}”.format(self.x, self.y)
p = Point(7,6)
#__str__メソッドをクラス内で定義すれば、
#オブジェクトをプリントするだけでパラメターが返される。
print(p)
Special (dunderscore) Methodsの一つに__add__がある。
returnとしてオブジェクトを返す(valueとしてオブジェクトをreturnする)
class Point:
def __init__(self, initX, initY):
self.x = initX
self.y = initY
def getX(self):
return self.x
def getY(self):
return self.y
def distanceFromOrigin(self):
return ((self.x ** 2) + (self.y ** 2)) ** 0.5
def __str__(self):
return “x = {}, y = {}”.format(self.x, self.y)
def halfway(self, target):
mx = (self.x + target.x)/2
my = (self.y + target.y)/2
#これでクラス生成オブジェクトがreturnされる。
return Point(mx, my)
p = Point(3,4)
q = Point(5,12)
#ここでクラス内halfwayメソッドを使ってクラス生成オブジェクトを受け取る。
mid = p.halfway(q)
print(mid)
print(mid.getX())
print(mid.getY())
クラス生成オブジェクトをソートするときkey=関数名で()はいらない
クラス生成オブジェクトでない場合
関数名で参照する場合は、関数名の後に括弧を付けずに関数名を指定することに注意してください。ソートされた関数は、リストの現在の項目を渡して、関数を呼び出す処理を行います。したがって、以下の例では key=len と書き、key=len() とは書きません。
クラス生成オブジェクトの場合(for statementを使う)
class Fruit():
def __init__(self, name, price):
self.Name = name
self.Price = price
def sort_priority(self):
return self.Price
L = [Fruit(“Cherry”, 10), Fruit(“Apple”, 5), Fruit(“Blueberry”, 20)]
print(“—–sorted by price, referencing a class method—–“)
#クラス内メソッドsort_priorityをクラスFruit生成オブジェクトに対して使う
for f in sorted(L, key=Fruit.sort_priority):
#f.Nameはクラス生成オブジェクトのparameter”name”を呼び出す。
print(f.Name)
print(“—- one more way to do the same thing—–“)
for f in sorted(L, key=lambda x: x.sort_priority()):
print(f.Name)
Class variable は初期値????20.10. Class Variables and Instance Variables クラス内メソッドを使用したとき、最後にclass variableを読み込む?
インタープリタは <obj>.<varname> という形の式を見たとき、次のようにします。
オブジェクトにインスタンス変数が設定されているかどうかをチェックする。もしそうなら、その値を使う。
インスタンス変数が見つからなければ、そのクラスにクラス変数があるかどうかを調べる。もしあれば、その値を使用する。
もし、インスタンス変数もクラス変数も見つからなければ、実行時エラーが発生します(実際には、次の章で学ぶように、最初にもう1つのチェックを行います)。
インタープリタは <obj>.<varname> = <expr> という形の代入文を見つけると、次のように実行する。
右辺の式を評価し、何らかの Python オブジェクトを生成します。
<obj>のインスタンス変数<varname>をそのPythonオブジェクトに束縛するように設定します。この形式の代入文は決してクラス変数を設定しないことに注意してください; それはインスタンス変数を設定するだけです。
クラス変数を設定するには、上のコードの4行目のように、クラス定義のトップレベルで <varname> = <expr> という形式の代入文を使用して、クラス変数printed_repを設定します。
20.13. A Tamagotchi Game
クラスの使い方 20.11. Thinking About Classes and Instances
あなたのクラスの1つのインスタンスは何を表現するのでしょうか?言い換えれば、あなたのプログラムでは、どのような新しいものが派手な機能を持つべきなのでしょうか?一曲?ハッシュタグ?1つのツイート?1つのポイント?この質問の答えは、あなたが定義するクラスを何と呼ぶかを決めるのに役立つはずです。
各インスタンスがインスタンス変数として持つべき情報は何でしょうか?これは、インスタンスが何を表しているかに関連しています。文章にできるかどうか試してみてください。”各インスタンスは1つの<曲>を表し、各<曲>はインスタンス変数として<アーティスト>と<タイトル>を持つ。” あるいは、”各インスタンスは1つの< ツイート >を表し、各< ツイート >は< ユーザー(投稿者) >と< メッセージ内容文字列 >をインスタンス変数として持つ。”といった具合です。
各インスタンスが持つべきインスタンスメソッドは何か?各インスタンスにできることは?同じ例で続けます。各曲は歌詞 API を使って歌詞の長い文字列を取得するメソッドを持っているかもしれません。各曲はアーティスト名の文字列を返すメソッドを持っているかもしれません。あるいは、ツイートの場合、各ツイートはツイートのメッセージの長さを返すメソッドを持っているかもしれない。(もっとワイルドに!)
インスタンスの印刷物はどのようなものでしょうか?(この質問は、__str__メソッドをどのように書くかを決める助けになります。) 例えば、「それぞれの曲を印刷すると、曲名とアーティスト名が表示される」とか「それぞれのツイートを印刷すると、投稿した人のユーザー名とツイートのメッセージ内容が表示される」とかです。
これらの質問を検討し、どのようにクラス定義に取り掛かるかを決定したら、クラス定義に取り掛かることができます。
テスト
どれがinstanceでどれがinstance variabeか
return はself.apple_quantityの数を増やさない!!!!
formatの中身はinstance variableの変数名を入れる
コメント