ホームページ  >  記事  >  バックエンド開発  >  Python でクラスとインスタンスの間でプロパティとメソッドをバインドする方法のコード例

Python でクラスとインスタンスの間でプロパティとメソッドをバインドする方法のコード例

黄舟
黄舟オリジナル
2017-08-20 10:54:021632ブラウズ

最近、純粋に趣味でPythonを勉強していますが、Pythonのプログラミングの本を体系的に読んだことがないので、以下の記事で主に学習サイトを紹介しています。 Python について、クラスとインスタンス間でプロパティとメソッドをバインドする方法についての情報が必要な場合は、それを参照してください。

まえがき

Pythonのクラスやインスタンスのメソッドを呼び出すときに混乱するのですが、考えた結果、理解を深めて記憶を定着させるため、そしてこれからPythonを学びたいと思っている人の助けになるように考えたことを記録します。友人はこの抽象言語を理解しています。Python は動的言語であるため、クラスおよびクラスに基づいて作成されたインスタンスは、以下に紹介する属性やメソッドに任意にバインドできます。

1. クラスバインディング属性

クラスバインディング属性は、汎用プロパティとしてクラス内で直接定義できます。


 class Student(object):
  name = 'Student'

この属性は [すべて] として分類されますが、クラスのすべてのインスタンスからアクセスできます。


class Student(object):
 name = 'Student'
s = Student() # 创建实例s
print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
print(Student.name) # 打印类的name属性
Student
Student

この時点で s.name の値を変更すると、次の結果が得られます:


s.name = 'xiaoming' # 给实例绑定name属性
print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性
print(Student.name) # 但是类属性并未消失,用Student.name仍然可以访问
xiaoming
Student

次に、s.name 属性を削除します:


del s.name # 如果删除实例的name属性
print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了
Student

同じ名前のインスタンス属性がクラス属性をオーバーライドし、インスタンス属性を削除した後、インスタンスは上位のクラス属性にアクセスすることがわかりました。

2. インスタンスのバインド属性

属性をインスタンスにバインドするには 2 つの方法があり、1 つはクラスの self 変数を使用する方法、もう 1 つはインスタンスに値を直接割り当てる方法です。


class Student(object):
 def __init__(self, name):
  self.name = name
s = Student('Bob')#方法一 通过类的self变量绑定属性
s.score = 90#方法二 直接赋值

3. クラスバインディングメソッド

クラスバインディングメソッドには 2 種類あり、1 つ目はクラスバインディング属性の形式であり、ルーチンは次のとおりです。

Class Student(object):
 pass
a=Student()#创建实例

def set_score(self,score):
 self.score=score

Student.set_score=set_score#类绑定方法
a.set_score(99)#调用方法
a.score
99#输出

2 つ目は、MethodType を使用してメソッドをクラスにバインドします:


Class Student(object):
 pass
a=Student()#创建实例

def set_score(self,score):
 self.score=score

from types import MethodType
Student.set_score = MethodType(set_score, Student)

a.set_score(99)#调用方法
a.score
99#输出

このメソッドについては、インスタンス b の作成を続ける場合に注意すべき点が 1 つあります:


b=Student()
b.set_score(60)
b.score
a.score
60

。 a の属性スコア値も 60 になることがわかります。ここでの私の個人的な理解は、ここでのスコアは前のメソッドのようにクラスに直接バインドされていないが、リストのような共有参照関係に似ている、つまり、インスタンス a と b の両方がこのスコアを独自の属性として参照しているということです。これが変更されると、それを参照するすべてのインスタンスの対応するプロパティも一緒に変更されます。


4. インスタンスバインディングメソッド

最初のメソッドは、上に示したように、インスタンスによって呼び出すことができるクラスにメソッドをバインドすることです。 2 つ目は、MethodType を使用してメソッドを単一のインスタンスにバインドすることです。

Class Student(object):
 pass
a=Student()#创建实例

def set_score(self,score):
 self.score=score

from types import MethodType
a.set_score = MethodType(set_score, a)

a.set_score(99)#调用方法
a.score
99#输出

このメソッドはインスタンス a に対してのみ機能することに注意してください。クラス Studnet のすべてのインスタンスを呼び出し可能にする必要がある場合は、メソッドをクラス Student に直接バインドするだけです。


概要

以上がPython でクラスとインスタンスの間でプロパティとメソッドをバインドする方法のコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。