ホームページ >バックエンド開発 >Python チュートリアル >Python3クラスをベースにした属性、メソッド、カプセル化、継承について詳しく解説
以下のエディターは、Python3 クラスに基づいた属性、メソッド、カプセル化、継承の説明例を提供します。編集者はこれがとても良いと思ったので、参考として共有します。エディターをフォローして見てみましょう
Python クラス
Python のクラスは、オブジェクト指向プログラミングのすべての基本機能を提供します。クラスの継承メカニズムにより複数の基本クラスが許可され、派生クラスはそのクラスをオーバーライドできます。基本クラス。どのメソッドでも基本クラス内の同じ名前のメソッドを呼び出すことができます。
オブジェクトには、任意の量および種類のデータを含めることができます。
Python クラスは C++ クラスに似ており、クラスのカプセル化、継承、多重継承、コンストラクター、デストラクターを提供します。
Python3では、Javaと同様に、クラスを定義するときに親クラスが記述されていない場合、オブジェクトクラスがその直接の親クラスになります。
クラス定義
クラス定義の構文形式は次のとおりです:
class ClassName: <statement-1> . . . <statement-N>
クラスオブジェクト: クラスを作成した後、クラス名を通じてそのプロパティとメソッドにアクセスし、変更できます
インスタンスobject: クラスがインスタンス化された後、クラス オブジェクトに影響を与えることなく、その属性を使用して (JavaScript と同様に) インスタンス オブジェクトに属性を動的に追加できます。
クラスの属性
ドット (.) を使用してオブジェクトの属性にアクセスできます
次の関数を使用して属性にアクセスすることもできます:
getattr(obj, name[,デフォルト]): オブジェクトの属性にアクセスします
hasattr(obj,name): 属性が存在するかどうかを確認します
setattr(obj,name,value): 属性を設定します。属性が存在しない場合は、新しい属性が作成されます
delattr(obj, name): 属性を削除します
Python 組み込みクラスの属性
__dict__: クラスの属性 (以下からなる辞書が含まれています)
__doc__: クラスのドキュメント文字列
__name__: クラス名
__module__: クラスが定義されているモジュール (クラスが定義されている場合、クラスの完全名は '__main__.className' です)インポートされたモジュール mymod にある場合、className.__module__ は mymod と等しい)
__bases__: クラスのすべての親クラス要素 (すべての親クラスで構成されるタプルを含む)
class Person: "Person类" def __init__(self, name, age, gender): print('进入Person的初始化') self.name = name self.age = age self.gender = gender print('离开Person的初始化') def getName(self): print(self.name) p = Person('ice', 18, '男') print(p.name) # ice print(p.age) # 18 print(p.gender) # 男 print(hasattr(p, 'weight')) # False # 为p添加weight属性 p.weight = '70kg' print(hasattr(p, 'weight')) # True print(getattr(p, 'name')) # ice print(p.__dict__) # {'age': 18, 'gender': '男', 'name': 'ice'} print(Person.__name__) # Person print(Person.__doc__) # Person类 print(Person.__dict__) # {'__doc__': 'Person类', '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__init__': <function Person.__init__ at 0x000000000284E950>, 'getName': <function Person.getName at 0x000000000284EA60>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__module__': '__main__'} print(Person.__mro__) # (<class '__main__.Person'>, <class 'object'>) print(Person.__bases__) # (<class 'object'>,) print(Person.__module__) # __main__
クラスのメソッド
クラス内では、def キーを使用します。一般的な関数定義とは異なり、クラスのメソッドには最初のパラメーターである self が含まれている必要があります。
クラスの独自メソッド:
__init__ コンストラクター、オブジェクト生成時に
__del__ デストラクターを呼び出す、
__repr__ を使用して印刷および変換する
__setitem__ インデックスに従って
__getitem__ Index に従って値
を取得する__レン__長さを取得します
__cmp__ 比較演算
__call__ 関数呼び出し
__add__ 加算演算
__sub__ 減算演算
__mul__ 乗算演算
__p__除算演算
__mod__ 剰余演算
__pow__() メソッドと呼ばれる特別なメソッドですクラスのコンストラクターまたは初期化メソッド。このメソッドは、このクラスのインスタンスが作成されるときに呼び出されます。これは、C++ 関数のコンストラクターと同様です。カスタム クラスの __init__() メソッドをオーバーライドするだけです。
class Person: def __init__(self, name, age, gender): print('进入Person的初始化') self.name = name self.age = age self.gender = gender print('离开Person的初始化') def getName(self): print(self.name) # Person实例对象 p = Person('ice', 18, '男') print(p.name) print(p.age) print(p.gender) p.getName() # 进入Person的初始化 # 离开Person的初始化 # ice # 18 # 男 # ice
methodInstance メソッド: インスタンス呼び出しのみを渡すことができます。インスタンス メソッドの最初に定義されたパラメーターは、インスタンス自体への参照のみにすることができます
class Myclass: def foo(self): print(id(self),'foo') a=Myclass()#既然是实例对象,那就要创建实例 a.foo()#输出类里的函数地址 print(id(a))#输出类对象的地址 #结果地址一样
class Myclass: @classmethod#类装饰器 def foo2(cls): print(id(cls),'foo2') #类对象,直接可以调用,不需要实例化 print(id(Myclass),'yy') Myclass.foo2()#直接可以调用
class Myclass: @staticmethod#静态方法 def foo3(): print('foo3') Myclass.foo3()#没有参数 a.foo3() #结果foo3
クラスのカプセル化Python は、変数名の命名によって属性とメソッドのアクセス権限を区別します。デフォルトの権限は、C++ および java の public と同等です
クラスのプライベート属性: __private_attrs: 2 つのアンダースコアで始まります。属性はプライベートとして宣言されており、クラス外で使用したり、直接アクセスしたりすることはできません。クラス内のメソッドで self.__private_attrs を使用する場合。
Python ではインスタンス化されたクラスがプライベート データにアクセスすることはできませんが、object._className__attrName を使用して属性にアクセスできます。実際、Python の内部プライベート化の実装では、attrName 属性が _className__attrName に変更されるだけです
class Demo: __id = 123456 def getId(self): return self.__id temp = Demo() # print(temp.__id) # 报错 AttributeError: 'Demo' object has no attribute '__id' print(temp.getId()) # 123456 print(temp._Demo__id) # 123456
オブジェクト指向プログラミングの主な利点の 1 つは、これを実現するためのコードの再利用です。再利用の 1 つの方法は、継承メカニズムを使用することです。継承は、クラス間のタイプとサブタイプの関係として完全に理解できます。
需要注意的地方:继承语法 class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。
在python中继承中的一些特点:
1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。使用super().__init__()或parentClassName.__init__()
2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。
语法:
派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后。
多态
如果父类方法的功能不能满足需求,可以在子类重写父类的方法。实例对象调用方法时会调用其对应子类的重写后的方法
python3.3 类与继承 小例
hon中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。
class Base: def __init__(self): self.data=[] def add(self,x): self.data.append(x) def addtwice(self,x): self.add(x) self.add(x) # child extends base class Child(Base): def plus(self,a,b): return a+b oChild=Child() oChild.add("str1") oChild.add(999) oChild.addtwice(4) print(oChild.data) print(oChild.plus(2,3))
对象可以包含任意数量和类型的数据。
python类与c++类相似,提供了类的封装,继承、多继承,构造函数、析构函数。
在python3中,所有类最顶层父类都是object类,与java类似,如果定义类的时候没有写出父类,则object类就是其直接父类。
类定义
类定义语法格式如下:
class ClassName: <statement-1> . . . <statement-N>
类对象:创建一个类之后,可以通过类名访问、改变其属性、方法
实例对象:类实例化后,可以使用其属性,可以动态的为实例对象添加属性(类似javascript)而不影响类对象。
类的属性
可以使用点(.)来访问对象的属性
也可以使用以下函数的方式来访问属性:
getattr(obj, name[, default]) : 访问对象的属性
hasattr(obj,name) : 检查是否存在一个属性
setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性
delattr(obj, name) : 删除属性
Python内置类属性
__dict__ : 类的属性(包含一个字典,由类的数据属性组成)
__doc__ :类的文档字符串
__name__: 类名
__module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
__bases__ : 类的所有父类构成元素(包含了以个由所有父类组成的元组)
class Person: "Person类" def __init__(self, name, age, gender): print('进入Person的初始化') self.name = name self.age = age self.gender = gender print('离开Person的初始化') def getName(self): print(self.name) p = Person('ice', 18, '男') print(p.name) # ice print(p.age) # 18 print(p.gender) # 男 print(hasattr(p, 'weight')) # False # 为p添加weight属性 p.weight = '70kg' print(hasattr(p, 'weight')) # True print(getattr(p, 'name')) # ice print(p.__dict__) # {'age': 18, 'gender': '男', 'name': 'ice'} print(Person.__name__) # Person print(Person.__doc__) # Person类 print(Person.__dict__) # {'__doc__': 'Person类', '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__init__': <function Person.__init__ at 0x000000000284E950>, 'getName': <function Person.getName at 0x000000000284EA60>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__module__': '__main__'} print(Person.__mro__) # (<class '__main__.Person'>, <class 'object'>) print(Person.__bases__) # (<class 'object'>,) print(Person.__module__) # __main__
类的方法
在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数。
类的专有方法:
__init__ 构造函数,在生成对象时调用
__del__ 析构函数,释放对象时使用
__repr__ 打印,转换
__setitem__按照索引赋值
__getitem__按照索引获取值
__len__获得长度
__cmp__比较运算
__call__函数调用
__add__加运算
__sub__减运算
__mul__乘运算
__p__除运算
__mod__求余运算
__pow__称方
__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法,与c++中构造函数类似。只需在自定义的类中重写__init__()方法即可。
class Person: def __init__(self, name, age, gender): print('进入Person的初始化') self.name = name self.age = age self.gender = gender print('离开Person的初始化') def getName(self): print(self.name) # Person实例对象 p = Person('ice', 18, '男') print(p.name) print(p.age) print(p.gender) p.getName() # 进入Person的初始化 # 离开Person的初始化 # ice # 18 # 男 # ice
析构函数 __del__ ,__del__在对象消逝的时候被调用,当对象不再被使用时,__del__方法运行:
类的封装
python通过变量名命名来区分属性和方法的访问权限,默认权限相当于c++和java中的public
类的私有属性: __private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时self.__private_attrs。
类的私有方法:__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods
虽然python不允许实例化的类访问私有数据,但可以使用 object._className__attrName 访问属性。其实python内部私有化的实现只是将attrName属性变为了_className__attrName而已
class Demo: __id = 123456 def getId(self): return self.__id temp = Demo() # print(temp.__id) # 报错 AttributeError: 'Demo' object has no attribute '__id' print(temp.getId()) # 123456 print(temp._Demo__id) # 123456
类的继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。
需要注意的地方:继承语法 class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。
在python中继承中的一些特点:
1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。使用super().__init__()或parentClassName.__init__()
2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。
语法:
派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后。
多态
如果父类方法的功能不能满足需求,可以在子类重写父类的方法。实例对象调用方法时会调用其对应子类的重写后的方法
python3.3 类与继承 小例
class Base: def __init__(self): self.data=[] def add(self,x): self.data.append(x) def addtwice(self,x): self.add(x) self.add(x) # child extends base class Child(Base): def plus(self,a,b): return a+b oChild=Child() oChild.add("str1") oChild.add(999) oChild.addtwice(4) print(oChild.data) print(oChild.plus(2,3))
以上がPython3クラスをベースにした属性、メソッド、カプセル化、継承について詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。