ゼロ基礎入門学習Python(36)--類と対象:対象を紹介する
26004 ワード
インテリジェントポイント
Python 3オブジェクト向け
Pythonはデザイン当初からオブジェクト向けの言語だったので、Pythonでクラスやオブジェクトを作成するのは簡単です.この章では、Pythonのオブジェクト向けプログラミングについて詳しく説明します.
もしあなたが以前オブジェクト向けのプログラミング言語に接触したことがないならば、あなたはまずいくつかのオブジェクト向け言語のいくつかの基本的な特徴を理解して、頭の中で1つの基本的なオブジェクト向けの概念を形成して、このようにPythonのオブジェクト向けのプログラムをもっと簡単に学ぶのに役立つかもしれません.
次に、以下のオブジェクトの基本的な特徴を簡単に理解します.
オブジェクト向けテクノロジーの概要クラス(Class):同じ属性とメソッドを持つオブジェクトのセットを記述するために使用されます.コレクション内の各オブジェクトに共通するプロパティとメソッドを定義します. メソッド:クラスで定義された関数. クラス変数:クラス変数は インスタンス変数:現在のインスタンスのクラスにのみ使用されるメソッド内の変数を定義します. データ・メンバー:クラス変数またはインスタンス変数は、クラスおよびそのインスタンス・オブジェクトに関するデータを処理するために使用されます. メソッド書き換え:親クラスから継承されたメソッドが子クラスのニーズを満たすことができない場合は、メソッドの上書き(override)と呼ばれ、メソッドの書き換えとも呼ばれるメソッドを書き換えることができます. 継承:派生クラス(derived class)がベースクラス(base class)を継承するフィールドとメソッドです.継承により、派生クラスのオブジェクトをベースクラスオブジェクトとして扱うこともできます. インスタンス化:クラスのインスタンス、クラスの特定のオブジェクトを作成します. オブジェクト:クラスによって定義されたデータ構造のインスタンス.オブジェクトには、2つのデータ・メンバー(クラス変数とインスタンス変数)とメソッドが含まれます.
Pythonは他のプログラミング言語と比較して,できるだけ新しい文法や意味を増やさずにクラスメカニズムを加えた.
Pythonのクラスはオブジェクト向けにプログラミングするすべての基本機能を提供しています.クラスの継承メカニズムは複数のベースクラスを許可し、派生クラスはベースクラスの任意の方法を上書きすることができ、方法ではベースクラスの同名の方法を呼び出すことができます.
オブジェクトには、任意の数とタイプのデータを含めることができます.
クラス定義
構文の形式は次のとおりです.
クラスをインスタンス化すると、そのプロパティを使用できます.実際には、クラスを作成した後、クラス名でそのプロパティにアクセスできます.
クラスオブジェクト
クラスオブジェクトは、
属性参照はPythonのすべての属性参照と同じ標準構文:
クラスオブジェクトが作成されると、クラスネーミングスペース内のすべてのネーミングが有効な属性名になります.クラス定義が次のように定義されている場合:
以上、新しいクラスインスタンスを作成し、そのオブジェクトをローカル変数x、xが空のオブジェクトに割り当てました.
多くのクラスは、オブジェクトを初期状態に作成する傾向があります.したがって、クラスは、次のように
クラスが
もちろん、
selfはクラスのインスタンスを表し、クラスではありません.
クラスのメソッドは、通常の関数とは特別な違いがあります.
これらには、
実行結果から明らかなように、selfはクラスのインスタンスを表し、現在のオブジェクトのアドレスを表し、
selfはpythonキーワードではなく、他のキーワードに変更しても正常に実行できます.
クラスのメソッド
クラスの内部では、
継承
Pythonは同様にクラスの継承をサポートしており,一つの言語が継承をサポートしなければクラスには意味がない.派生クラスの定義は次のとおりです.
カッコ内のベースクラスの順序に注意してください.ベースクラスに同じメソッド名があり、サブクラスで使用するときに指定されていない場合は、Pythonが左から右に検索します.つまり、メソッドがサブクラスに見つからない場合は、左から右にベースクラスにメソッドが含まれているかどうかを検索します.
BaseClassName(例のベースクラス名)は、派生クラスと1つの役割ドメイン内で定義する必要があります.クラスに加えて、ベースクラスが別のモジュールで定義されている場合、式を使用することもできます.
マルチ継承
Pythonも同様に限られたサポートマルチ継承形式である.複数継承クラスの定義は次の例です.
カッコ内の親の順序に注意してください.親に同じメソッド名があり、子クラスで使用するときに指定されていない場合は、pythonが左から右に検索します.つまり、メソッドが子クラスで見つからない場合は、親クラスにメソッドが含まれているかどうかを左から右に検索します.
メソッド書き換え
親メソッドの機能があなたのニーズを満たすことができない場合は、子メソッドで親メソッドを書き換えることができます.例は次のとおりです.
クラスのプロパティとメソッド
クラスのプライベート属性
クラスのメソッド
クラス内では、
クラスのプライベートメソッド
クラスのプライベート属性の例は次のとおりです.
クラスのプライベートメソッドの例は次のとおりです.
クラスの独自の方法 を呼び出す. を使用 を割り当てる を取得 を得る を求める 演算子の再ロード
Pythonは同様に演算子のリロードをサポートしており、クラスの独自の方法をリロードすることができます.例は次のとおりです.
授業後の練習問題.
テスト問題オブジェクトのプロパティと方法は、プログラミングで実際に何ですか? クラスとオブジェクトの関係は何ですか? クラスの定義は、それほど「擬物」ではない場合があります.抽象的な場合があります.例えば、矩形クラスを定義すると、どのような属性と方法を追加しますか. クラスの属性定義はできるだけ抽象的にすべきか、それともできるだけ具体的にすべきか. オブジェクト向けのいくつかの特徴を一言で要約してください. 関数と方法の違いは何ですか?
手を動かす次のプロンプトに従ってPersonクラスを定義し、クラスインスタンスオブジェクトを生成しようとします.属性:名前(デフォルト名は「小甲魚」)の方法:名前のヒントを印刷する:方法の中で属性に対する参照形式にselfを加える必要がある、例えばself.name 次のプロンプトに従って矩形クラスを定義し、クラスインスタンスオブジェクトを生成しようとします.属性:長さと幅の方法:長さと幅を設定->setRect(self)、長さと幅を取得->getRect(self)、面積を取得->getArea(self)ヒント:方法では属性の参照形式にself(selfなど)を追加する必要がある.name
Python 3オブジェクト向け
Pythonはデザイン当初からオブジェクト向けの言語だったので、Pythonでクラスやオブジェクトを作成するのは簡単です.この章では、Pythonのオブジェクト向けプログラミングについて詳しく説明します.
もしあなたが以前オブジェクト向けのプログラミング言語に接触したことがないならば、あなたはまずいくつかのオブジェクト向け言語のいくつかの基本的な特徴を理解して、頭の中で1つの基本的なオブジェクト向けの概念を形成して、このようにPythonのオブジェクト向けのプログラムをもっと簡単に学ぶのに役立つかもしれません.
次に、以下のオブジェクトの基本的な特徴を簡単に理解します.
オブジェクト向けテクノロジーの概要
.
で共通です.クラス変数はクラス内で定義され、関数体の外にあります.クラス変数は通常、インスタンス変数として使用されません.Pythonは他のプログラミング言語と比較して,できるだけ新しい文法や意味を増やさずにクラスメカニズムを加えた.
Pythonのクラスはオブジェクト向けにプログラミングするすべての基本機能を提供しています.クラスの継承メカニズムは複数のベースクラスを許可し、派生クラスはベースクラスの任意の方法を上書きすることができ、方法ではベースクラスの同名の方法を呼び出すことができます.
オブジェクトには、任意の数とタイプのデータを含めることができます.
クラス定義
構文の形式は次のとおりです.
class ClassName:
1>
.
.
.
N>
クラスをインスタンス化すると、そのプロパティを使用できます.実際には、クラスを作成した後、クラス名でそのプロパティにアクセスできます.
クラスオブジェクト
クラスオブジェクトは、
と
の2つの操作をサポートします.属性参照はPythonのすべての属性参照と同じ標準構文:
obj.name
を使用します.クラスオブジェクトが作成されると、クラスネーミングスペース内のすべてのネーミングが有効な属性名になります.クラス定義が次のように定義されている場合:
#
class Myclass:
# :
i = 12345
# :
def f(self):
return 'hello world'
#
x = Myclass()
#
print('Myclass i :',x.i)
print('Myclass f :',x.f())
以上、新しいクラスインスタンスを作成し、そのオブジェクトをローカル変数x、xが空のオブジェクトに割り当てました.
=== ===
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
Myclass i : 12345
Myclass f : hello world
多くのクラスは、オブジェクトを初期状態に作成する傾向があります.したがって、クラスは、次のように
__int__()
の特殊なメソッド(構築メソッド)を定義することができます.def __init__(self):
self.data = []
クラスが
__init__()
を定義すると、クラスのインスタンス化操作は__init()
メソッドを自動的に呼び出す.次の例では、新しいインスタンスを作成できます.x = Myclass()
もちろん、
__init__()
メソッドにはパラメータがあり、パラメータは__init__()
を介してクラスのインスタンス化動作に伝達される.例:class Complex:
def __init__(self,realpart,imagpart):
self.r = realpart
self.i = imagpart
x = Complex(3.0, -4.5)
print(x.r,x.i)
=== ===
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
3.0 -4.5
selfはクラスのインスタンスを表し、クラスではありません.
クラスのメソッドは、通常の関数とは特別な違いがあります.
これらには、
self
という慣例に従って、追加の最初のパラメータ名が必要です.class Test:
def prt(self):
print(self)
print(self.__class__)
t = Test()
t.prt()
=== ===
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
<__main__.test object="" at="" class="hljs-number">0x00000014F5E029E8>
<class '__main__.Test'>
実行結果から明らかなように、selfはクラスのインスタンスを表し、現在のオブジェクトのアドレスを表し、
self.__class__
はクラスを指す.selfはpythonキーワードではなく、他のキーワードに変更しても正常に実行できます.
class Test:
def prt(zz):
print(zz)
print(zz.__class__)
t = Test()
t.prt()
=== ===
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
<__main__.test object="" at="" class="hljs-number">0x000000C5A4402978>
<class '__main__.Test'>
クラスのメソッド
クラスの内部では、
def
キーワードを使用してメソッドを定義します.一般的な関数定義とは異なり、クラスメソッドにはパラメータself
が含まれ、最初のパラメータであるself
はクラスのインスタンスを表します.class People:
#
name = ''
age = 0
# ,
__weight = 0
#
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print('%s : %d 。' % (self.name,self.age))
# 1
p = People(' ',10,30)
p.speak()
=== ===
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
: 10 。
# 2
p = People(' ',10)
p.speak()
=== ===
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
Traceback (most recent call last):
File "D:/untitled/Python_learn/test1.py", line 16, in
p = People(' ',10)
TypeError: __init__() missing 1 required positional argument: 'w'
継承
Pythonは同様にクラスの継承をサポートしており,一つの言語が継承をサポートしなければクラスには意味がない.派生クラスの定義は次のとおりです.
class DerivedClassName(BaseClassName1):
.
.
.
N >
カッコ内のベースクラスの順序に注意してください.ベースクラスに同じメソッド名があり、サブクラスで使用するときに指定されていない場合は、Pythonが左から右に検索します.つまり、メソッドがサブクラスに見つからない場合は、左から右にベースクラスにメソッドが含まれているかどうかを検索します.
BaseClassName(例のベースクラス名)は、派生クラスと1つの役割ドメイン内で定義する必要があります.クラスに加えて、ベースクラスが別のモジュールで定義されている場合、式を使用することもできます.
class DerivedClassName(modname.BaseClassName)
#
class People:
#
name = ''
age = 0
# ,
__weight = 0
#
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print('%s : %d 。' % (self.name,self.age))
#
class Student(People):
grade = ''
def __init__(self,n,a,w,g):
#
People.__init__(self,n,a,w)
self.grade = g
#
def speak(self):
print('%s : %d , %d ' % (self.name, self.age,self.grade))
s = Student(' ',10,60,3)
s.speak()
=== ===
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
: 10 , 3
マルチ継承
Pythonも同様に限られたサポートマルチ継承形式である.複数継承クラスの定義は次の例です.
class DerivedClassName(Base1, Base2, Base3):
.
.
.
N >
カッコ内の親の順序に注意してください.親に同じメソッド名があり、子クラスで使用するときに指定されていない場合は、pythonが左から右に検索します.つまり、メソッドが子クラスで見つからない場合は、親クラスにメソッドが含まれているかどうかを左から右に検索します.
#
class People:
#
name = ''
age = 0
# ,
__weight = 0
#
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print('%s : %d 。' % (self.name,self.age))
#
class Student(People):
grade = ''
def __init__(self,n,a,w,g):
#
People.__init__(self,n,a,w)
self.grade = g
#
def speak(self):
print('%s : %d , %d ' % (self.name, self.age,self.grade))
# ,
class Speaker():
topic = ''
name = ''
def __init__(self,n,t):
self.name = n
self.topic = t
def speak(self):
print(" %s, , %s" % (self.name, self.topic))
#
class Sample(Speaker,Student):
a = ''
def __init__(self,n,a,w,g,t):
Student.__init__(self,n,a,w,g)
Speaker.__init__(self,n,t)
test = Sample(' ',25,80,4,'Python')
test.speak() # ,
=== ===
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
, , Python
メソッド書き換え
親メソッドの機能があなたのニーズを満たすことができない場合は、子メソッドで親メソッドを書き換えることができます.例は次のとおりです.
#
class Parent:
def mymethod(self):
print(' ')
#
class Child(Parent):
def mymethod(self):
print(' ')
#
c = Child()
#
c.mymethod()
#
super(Child,c).mymethod() #super() ( ) 。
=== ===
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
クラスのプロパティとメソッド
クラスのプライベート属性
__private_attrs
:2つの下線の先頭に、この属性がプライベートであることを宣言し、クラスの外部で使用または直接アクセスできません.クラス内のメソッドでは、self.__private_attrs
が使用されます.クラスのメソッド
クラス内では、
def
キーワードを使用してメソッドを定義し、一般的な関数定義とは異なり、クラスメソッドはパラメータself
を含まなければならず、最初のパラメータであり、self
はクラスのインスタンスを表す.クラスのプライベートメソッド
__private_method
:2つの下線の先頭に、このメソッドがプライベートメソッドであることを宣言し、クラスの内部でのみ呼び出され、クラスの外部で呼び出されません.self.__private_methods
クラスのプライベート属性の例は次のとおりです.
class JustCounter:
__secretCount = 0 #
publicCount = 0 #
def count(self):
self.__secretCount += 1
self.publicCount += 1
print(self.__secretCount)
counter = JustCounter()
counter.count()
counter.count()
print(counter.publicCount)
print(counter.__secretCount) # ,
=== ===
1
2
2
Traceback (most recent call last):
File "D:/untitled/Python_learn/test1.py", line 18, in
print(counter.__secretCount) # ,
AttributeError: 'JustCounter' object has no attribute '__secretCount'
クラスのプライベートメソッドの例は次のとおりです.
class Site:
def __init__(self,name,url):
self.name = name #public
self.__url = url #private
def who(self):
print('name : ',self.name)
print('url :',self.__url)
def __foo(self): #
print(' ')
def foo(self): #
print(' ')
self.__foo()
x = Site(' ','https://blog.csdn.net/wanbin6470398/')
x.who()
=== ===
name :
url : https://blog.csdn.net/wanbin6470398/
x.foo()
=== ===
x.__foo()
=== ===
Traceback (most recent call last):
File "D:/untitled/Python_learn/test1.py", line 21, in
x.__foo()
AttributeError: 'Site' object has no attribute '__foo'
クラスの独自の方法
__init__
:コンストラクション関数で、オブジェクトの生成時に__del__
:構造関数、オブジェクトを解放するときに__repr__
:印刷、変換__setitem__
:インデックスに従って__getitem__
:インデックスに従って値__len__
:長さ__cmp__
:比較演算__call__
:関数呼び出し__add__
:加算__sub__
:減算__mul__
:乗算__div__
:除算__mod__
:余演算__pow__
:乗方Pythonは同様に演算子のリロードをサポートしており、クラスの独自の方法をリロードすることができます.例は次のとおりです.
class Vector:
def __init__(self,a,b):
self.a = a
self.b = b
def __str__(self):
return 'Vector(%d,%d)' % (self.a,self.b)
def __add__(self, other):
return Vector(self.a + other.a,self.b + other.b)
v1 = Vector(2,10)
v2 = Vector(5,-2)
print(v1 + v2)
=== ===
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
Vector(7,8)
授業後の練習問題.
テスト問題
( ) ( )
。
, ,
。
クラスを定義したら、
クラスによってインスタンス化されたオブジェクトを想像できますか? , ,Tom,Hello Kitty
, 、
, 。
:
:
: ,
self 。
手を動かす
class Person:
name = ' '
def printName(self):
print(self.name)
a = Person()
a.printName()
=== ===
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
>>> class Rectangle:
length = 5
width = 4
def setRect(self):
print(' ...')
self.length = float(input(' :'))
self.width = float(input(' :'))
def getRect(self):
print(' : %.2f, : %.2f' % (self.length,self.width))
def getArea(self):
return self.length * self.width
>>> a = Rectangle()
>>> a.getRect()
: 5.00, : 4.00
>>> a.setRect()
...
:5
:6
>>> a.getRect()
: 5.00, : 6.00
>>> a.getArea()
30.0