1. オブジェクト指向
クラス (クラス): 同じプロパティとメソッドを記述するために使用されるオブジェクトのコレクションです。
クラス変数: クラス変数は、インスタンス化されたオブジェクト全体でパブリックです。通常、クラス内および関数本体の外で定義されます。
メソッド: クラス内の関数
データ メンバー: クラス変数またはインスタンス変数は、クラスとそのインスタンス オブジェクトに関連するデータを処理するために使用されます。
メソッドの書き換え: 親クラスから継承したメソッドがサブクラスのニーズを満たせない場合は、メソッドを書き換えることができます。このプロセスはメソッド オーバーライドと呼ばれ、メソッドの書き換えとも呼ばれます。
ローカル変数: メソッドで定義された変数は、現在のインスタンスのクラスにのみ作用します。
インスタンス変数: クラスの宣言では、属性を変数で表現します。このような変数をインスタンス変数といいます。インスタンス変数とは、self で修飾された変数です。
継承: つまり、派生クラスは基本クラスのフィールドとメソッドを継承します。継承により、派生クラスのオブジェクトを基本クラス オブジェクトとして扱うこともできます。フルーツ クラスを定義してから派生クラス apple を定義するのと同じように、このクラスにはフルーツ クラスのいくつかの属性とメソッドがあり、フルーツ クラスに似た独自の固有の属性とメソッドもいくつかあります。 「ある」関係。
インスタンス化: クラスの特定のオブジェクト。クラス イメージはテンプレートのようなものです。それをオブジェクトにインスタンス化した後でのみ、対応する操作を実行できます。
オブジェクト: クラスを通じて定義されたデータ構造インスタンス。オブジェクトには 2 つのデータ メンバー (クラス変数とインスタンス変数) とメソッドが含まれます。
2. クラス定義
クラスを定義します:
class ClassName:.... .... ....
クラス名はキャメルケースで命名することをお勧めします。すべて大文字
3. クラス オブジェクト メソッドを使用する
クラス オブジェクトは、属性参照とインスタンス化の 2 つの操作をサポートします
属性参照: in python その他の構文は同じ obj.name
の __ が付いた属性はクラスのプライベート属性です クラス外からプライベート属性に直接アクセスすることはできません __name.
class Fruit:#这是类的一个基本属性self.number = 100def get_number(self): a = self.number + 100return a f = Fruit()print('We have {0} fruits'.format(f.number))print('We have {0} fruits'.format(f.get_number()))
は:
We have 100 fruitsWe have 200 fruits
4. 構築メソッド
Python クラスには __init__() という名前の特別なメソッドがあり、これは構築と呼ばれます。このメソッドはクラス内で実行され、C のクラスのコンストラクターと同様に、インスタンス化中に自動的に呼び出されます (クラス属性の初期化などに使用できます)。
def __init__(self):self.data = []
クラスは __init__() メソッドを定義しており、クラスのインスタンス化操作により __init__() メソッドが自動的に呼び出されます。
class Fruit:def __init__(self): print('你已经实例化了一个对象') f = Fruit()
出力結果
你已经实例化了一个对象
init_() メソッドにはパラメータを含めることができ、パラメータは init() を通じてクラスのインスタンス化操作に渡されます。
class Complex:def __init__(self,real,image):self.r = realself.i = imagedef get_complex(self): print('complex real is %.2f , image is %.2f'%(self.r,self.i)) a = Complex(3.5,-3)a.get_complex()
出力は次のとおりです。
complex real is 3.50 , image is -3.00
self はクラスではなく、クラスのインスタンスを表します。クラス メソッドと通常の関数の間には、特別な違いが 1 つだけあります。追加の最初のパラメータ名が必要です。慣例により、これは self です。ただし、self は Python のキーワードではありません。
こんなふうに理解して良いでしょうか? Self はクラスに従ってオブジェクトをインスタンス化した後のオブジェクトのアドレスを表します。 C クラスのこのポインターとよく似ています
class Test:def prt(self): print(self) print(self.__class__) t = Test()t.prt()
出力:
<__main__.Test object at 0x0000025EC6D45608><class '__main__.Test'>
5. クラス メソッド
クラス内で、def キーワードを使用して、一般的な関数定義とは異なり、クラス メソッドには最初のパラメータであるパラメータ self が含まれている必要があります。パラメータを自分で渡す必要がない場合は、静的メソッドを示すために関数の前に @staticmethod を追加する必要があります
class Complex:def __init__(self, real=None, image=None):self.r = realself.i = image def get_complex(self): print('complex real is %.2f , image is %.2f' % (self.r, self.i)) @staticmethoddef test(a, b): print('complex real is %.2f , image is %.2f' % (a, b)) a = Complex(3.5, -3)a.get_complex() b = Complex()b.test(3, -2)
出力結果
complex real is 3.50 , image is -3.00complex real is 3.00 , image is -3.00
6継承
Python はクラスの継承もサポートしており、形式は次のとおりです:
class Derivedclassname(Baseclassname): ... ...
Baseclassname (基本クラス名) は、派生クラスと同じスコープで定義する必要があります。クラスに加えて、式も使用できます。これは、基本クラスが別のモジュールで定義されている場合に非常に便利です。
class Fruit: def __init__(self,sweet): self.sweetness = sweet def describe(self): print('Our fruit has a sweetness of %.2f'%self.sweetness) class Apple(Fruit):#单继承,继承fruit类 def __init__(self,sweet,color): self.color = color Fruit.__init__(self,sweet) def describe(self):#改写基类fruit的方法 print('Our apple has a sweetness of {0:.2f}%,and color is {1}'.format(self.sweetness,self.color)) apple = Apple(62.2,'red')apple.describe()
Output:
Our apple has a sweetness of 62.20%,and color is red
多重継承
Python複数の基底クラスを継承することもできます:
class Derivedclassname(basename1,basename2,...): ... ... ...
括弧内の親クラスの順序に注意する必要があります。親クラスに同じメソッド名があっても、使用時に指定されていない場合は、サブクラスの場合、Python は左から右に検索します。つまり、メソッドがサブクラスに見つからない場合は、左から右に検索して、メソッドが親クラスに含まれているかどうかを確認します。
class Fruit:def __init__(self, sweet): self.sweetness = sweetdef describe(self): print('Our fruit has a sweetness of %.2f' % self.sweetness) class Food:def __init__(self, uprice, num): self.unit_price = uprice self.number = num self.total_price = num * upricedef cost(self): print('You need to pay {0:.3} yuan, thank you'.format(self.total_price)) class Apple(Fruit, Food):def __init__(self, sweet, color, uprice, num): self.color = color Fruit.__init__(self, sweet) Food.__init__(self, uprice, num)def describe(self): print('Our fruit has a sweetness of {0:.2f}%,and color is {1}'.format(self.sweetness, self.color))
出力:
Our fruit has a sweetness of 62.20%,and color is redYou need to pay 73.5 yuan, thank you
7、方法重写
如果父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法,如果想调用已经被覆盖的基类方法,可以用super(子类名,子类实例对象名).父类方法
class Parent_class:def Method(self): print ('父类方法') class Child_class(Parent_class): # 定义子类def Method(self): print ('子类方法') c = Child_class() # 子类实例化c.Method() # 子类调用重写方法super(Child_class,c).Method() #用子类对象调用父类已被覆盖的方法
子类继承父类构造函数
如果在子类中需要父类的构造方法就需要显式地调用父类的构造方法,或者不重写父类的构造方法。
class A:def __init__(self, x, y): self.x = x self.y = y print('pos is ({0},{1})'.format(self.x, self.y)) def xxx(self): print('parent now') class B(A):def xxx(self): print('child now') b = B(10, 3)b.xxx()
输出
pos is (10,3)child now
如果重写了__init__ 时,实例化子类,就不会调用父类已经定义的 __init__。
如果重写了__init__ 时,要继承父类的构造方法,可以使用 super 关键字super(子类,self).__init__(参数1,参数2,....),或者父类名称.__init__(self,参数1,参数2,...)
8、类的私有属性
两个下划线开头,声明该属性为私有,像__name不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__name。
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) # 报错,实例不能访问私有变量
Traceback (most recent call last):File "test.py", line 16, in <module> print (counter.__secretCount) # 报错,实例不能访问私有变量AttributeError: 'JustCounter' object has no attribute '__secretCount'
两个下划线开头,声明该方法为私有方法,像__private_method,只能在类的内部调用 ,不能在类的外部调用。self.___private_method。
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.xxx.com')x.who() # 正常输出x.foo() # 正常输出x.__foo() # 报错
输出:
'''name : ***url : www.***.com这是公共方法这是私有方法Traceback (most recent call last): File "F:\Python\Program\test.py", line 61, in <module> x.__foo() # 报错AttributeError: 'Site' object has no attribute '__foo''''
类的专有方法
__init__ : 构造函数,在生成对象时调用,类似C++构造函数
__del__: 析构函数,释放对象时使用,类似C++析构函数,常用在释放申请的内存空间
__repr__: 打印,转换。这个个函数就是在打印类的时候,控制类输出的字符串
class Name:def __init__(self, name): self.name = name print(Name('s'))
'''<__main__.Name object at 0x0000023744AFD248>'''
class Name:def __init__(self,name): self.name = name def __repr__(self): #控制了在打印类时候的输出 return 'Name({!r})'.format(self.name) print(Name('s')) '''Name('s')'''
__setitem__ : 每当属性被赋值的时候都会调用该方法,因此不能再该方法内赋值 self.name = value 会死循环
__getitem__: 当访问不存在的属性时会调用该方法
__len__: 获得长度,如果一个类表现得像一个list,要获取有多少个元素,就得用len() 函数。要让len()函数工作正常,类必须提供一个特殊方法__len__(),它返回元素的个数。
class CountList:def __init__(self, *args): self.list = [x for x in args] self.count = self.__len__() def __len__(self): return len(self.list) def get_count(self): return self.count a = CountList(1, 2, 3, 4, 4, 5)print(a.get_count())print(len(a))
__cmp__: 比较运算
__call__: 函数调用
__add__: 加运算
__sub__: 减运算
class MyClass: def __init__(self, height, weight): self.height = height self.weight = weight # 两个对象的长相加,宽不变.返回一个新的类def __add__(self, others): return MyClass(self.height + others.height, self.weight + others.weight) # 两个对象的宽相减,长不变.返回一个新的类def __sub__(self, others): return MyClass(self.height - others.height, self.weight - others.weight) # 说一下自己的参数def intro(self): print("高为", self.height, " 重为", self.weight) def main(): a = MyClass(height=10, weight=5) a.intro() b = MyClass(height=20, weight=10) b.intro() c = b - a c.intro() d = a + b d.intro() if __name__ == '__main__': main()
'''高为 10 重为 5高为 20 重为 10高为 10 重为 5高为 30 重为 15'''
__mul__: 乘运算
__truediv__: 除运算
__mod__: 求余运算
__pow__: 乘方
同样的。类的专有方法也可以重写
以上がPython クラスの基本的な使用方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。