Latest web development tutorials

python3のオブジェクト指向

Pythonは最初から設計されたオブジェクト指向言語であり、そのようなものとして、Pythonでクラスとオブジェクトを作成することは非常に簡単です。 このセクションでは、我々は詳細Pythonでオブジェクト指向プログラミングをでしょう。

あなたはオブジェクト指向するプログラミング言語を暴露されていない場合は、まず、あなたがより簡単にPythonを学ぶことができますオブジェクト指向の基本概念、内部の心の中で形成されたオブジェクト指向言語の基本的な機能のいくつかを理解する必要があるかもしれませんオブジェクト指向プログラミング。

次は、オブジェクト指向のいくつかの基本的な機能の下での単純な理解をみましょう。


オブジェクト指向技術の概要

  • クラス(クラス):コレクションを記述するために使用されるオブジェクトの同じプロパティとメソッドを持っています。 これは、それぞれのオブジェクトに共通するプロパティとメソッドのセットを定義します。 オブジェクトは、クラスのインスタンスです。
  • クラス変数:クラス変数は、インスタンス化されたオブジェクト間で共通しています。 クラス変数は定義され、クラス内での関数の外側。 クラス変数は、通常、インスタンス変数として使用されていません。
  • 関連するデータ処理クラスとインスタンスオブジェクトのクラス変数やインスタンス変数:データメンバー
  • オーバーライド:あなたはサブクラスのニーズを満たすことができない場合は、親クラスのメソッドを継承し、それは、また、オーバーライドするメソッドとして知られているオーバーレイ法(オーバーライド)と呼ばれるプロセスを、書き換えることができます。
  • 変数の例:メソッドで定義された変数、現在のインスタンスのクラスの役割のみ。
  • 継承:それは派生クラス(派生クラス)が基底クラス(基底クラス)フィールドとメソッドを継承しています。 継承は、ベースクラスのオブジェクトの御馳走として、派生クラスのオブジェクトを可能にします。 例えば、このような設計がある:犬動物のクラスから派生したオブジェクトタイプ、アナログでの関係」(ある-a)は、「(図の例で、犬の動物です)。
  • クラスのインスタンスを作成し、特定のオブジェクトクラス:インスタンス化します。
  • 方法:クラス定義関数。
  • オブジェクト:クラス定義を介してデータ構造のインスタンス。 データオブジェクトは二つの部材(クラスとインスタンス変数)とメソッドが含まれます。

そして、他のプログラミング言語は、新しい構文や状況の意味の最低Pythonはクラスのメカニズムに参加します。

オブジェクト指向プログラミングでPythonのクラスは、すべての基本的な機能を提供します:クラスの継承機構は、複数の基底クラスを可能にする派生クラスで基本クラスは、任意のメソッドをオーバーライドすることができます、あなたは同じ名前の基底クラスのメソッドを呼び出すことができます。

オブジェクトは、データの任意の数およびタイプを含むことができます。

クラス定義

構文は次のとおりです。

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

クラスがインスタンス化された後、あなたはクラスを作成した後、あなたは、クラス名を経由してそのプロパティにアクセスすることができ、実際には、そのプロパティを使用することができます。

Classオブジェクト

属性参照とインスタンス:Classオブジェクトは、操作の2種類をサポートしています。

obj.name:参照がすべての属性のためのPythonを使用する属性は、標準的な構文を参照ます。

クラスオブジェクトは、クラスの名前空間属性を作成した後、すべての名前は、有効な名前です。 だから、クラス定義はこのように見えた場合:

#!/usr/bin/python3

class MyClass:
    """一个简单的类实例"""
    i = 12345
    def f(self):
        return 'hello world'

# 实例化类
x = MyClass()

# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.i)
print("MyClass 类的方法 f 输出为:", x.f())

クラスをインスタンス化します。

# 实例化类
x = MyClass()
# 访问类的属性和方法

上記の空のオブジェクトをX、クラスの新しいインスタンスを作成し、ローカル変数xへのこのオブジェクトを割り当てます。

上記のプログラムの出力は、次のとおりです。

MyClass 类的属性 i 为: 12345
MyClass 类的方法 f 输出为: hello world

多くのクラスは、既知の初期状態のオブジェクトを作成したいです。 したがって、クラスは、このような名前の__init __()特別なメソッド(コンストラクタ)を、定義することができます。

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)
>>> x.r, x.i
(3.0, -4.5)

クラスメソッド

地上波内部には、使用defキーワードは、クラスメソッドとして定義することができ、異なる定義および一般的な機能、クラスメソッドは、パラメータの自己を含める必要がありますし、最初のパラメータとして:

#!/usr/bin/python3

#类定义
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))

# 实例化类
p = people('w3big',10,30)
p.speak()

上記のプログラムの出力は、次のとおりです。

w3big 说: 我 10 岁。

受け継ぎます

Pythonはまた、言語は継承をサポートしていない場合、クラスはほとんど意味を持ち、クラスの継承をサポートしています。 派生クラスの定義を次のように

class DerivedClassName(BaseClassName1):
    <statement-1>
    .
    .
    .
    <statement-N>

なお、カッコ内の基本クラスの順序、基本クラスが同じメソッド名を持っている場合、しかし、見つける左から右に、サブクラスで発見されていない右側の検索方法左からサブクラス、Pythonを指定せず基底クラスはメソッドが含まれています。

BaseClassName(例えば、基底クラス名)は、派生クラスのスコープで定義する必要があります。 クラスに加えて、あなたが表現を使用することができ、ベースクラスは、のために非常に有用である別のモジュールで定義されています。

class DerivedClassName(modname.BaseClassName):

#!/usr/bin/python3

#类定义
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('ken',10,60,3)
s.speak()

上記のプログラムの出力は、次のとおりです。

ken 说: 我 10 岁了,我在读 3 年级

多重継承

Pythonは多重継承の制限された形式をサポートしています。 次のように多重継承クラス定義はなります。

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>

親クラスが見つけるために左から右へ、しかし、サブクラスを指定せずに、左からのサブクラスで発見されていない右側の検索方法へのpythonを同じメソッド名を持っている場合、括弧の親クラスでその順序に注意してください。親クラスはメソッドが含まれています。

#!/usr/bin/python3

#类定义
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("Tim",25,80,4,"Python")
test.speak()   #方法名同,默认调用的是在括号中排前地父类的方法

上記のプログラムの出力は、次のとおりです。

我叫 Tim,我是一个演说家,我演讲的主题是 Python

メソッドのオーバーライド

あなたは親クラスのメソッドである関数はあなたのニーズを満たすことができない場合は、サブクラスであなたの親クラスのメソッドを書き換えることができ、次のように、例を示します。

#!/usr/bin/python3

class Parent:        # 定义父类
   def myMethod(self):
      print ('调用父类方法')

class Child(Parent): # 定义子类
   def myMethod(self):
      print ('调用子类方法')

c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法

上記のプログラムの出力は、次のとおりです。

调用子类方法

クラスの属性とメソッド

プライベートプロパティクラス

__private_attrs:プロパティがプライベートで使用するか、または外部クラスに直接アクセスできないことを示す2つのアンダースコアを開始します。 自己.__ private_attrsクラスメソッド内で使用されるとき。

クラスメソッド

地上波内部には、使用defキーワードは、異なる機能の一般的な定義とクラスメソッドとして定義することができ、クラスメソッドは、パラメータ、自己が含まれ、最初のパラメータとして必要があります

クラスのプライベートメソッド

__private_method:最初の2アンダースコア、メソッドは、クラスのprivateメソッドは外部から呼び出すことができないと宣言されています。 内部クラスのコールSLEF .__ private_methods。

クラスのプライベートプロパティインスタンスを次のように

#!/usr/bin/python3

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 "test.py", line 16, in <module>
    print (counter.__secretCount)  # 报错,实例不能访问私有变量
AttributeError: 'JustCounter' object has no attribute '__secretCount'

クラスのプライベートメソッドのインスタンスを次のように

#!/usr/bin/python3

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('本教程', 'www.w3big.com')
x.who()        # 正常输出
x.foo()        # 正常输出
x.__foo()      # 报错

上記の例の結果:

クラスの独自のメソッド:

  • __init__:コンストラクタは、オブジェクトが生成されるときに呼び出され
  • __del__:デストラクタ、リリースオブジェクト
  • __repr__:印刷、変換
  • __setitem__:インデックス割り当てに従って、
  • __getitem__:インデックスの値を取得します。
  • __len__:長さを取得
  • __cmp__:比較演算
  • __call__:関数呼び出し
  • __add__:操作を追加
  • __sub__:減算
  • __mul__:乗算
  • __div__:除算演算
  • __mod__:剰余演算子
  • __pow__:着信側

演算子の多重定義

Pythonはまた、私はクラス独自のメソッドオーバーロードすることができるか、演算子のオーバーロードをサポートし、次のように、例を示します。

#!/usr/bin/python3

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)

次のように上記のコードの実行結果は以下のとおりです。

Vector(7,8)