Pythonオブジェクト指向(継承、多態性、カプセル化、パラメーターの受け渡し、ダックタイプ、ローカル変数)

Pythonオブジェクト指向:

1.オブジェクトをインスタンス化することにより、クラスの属性を動的に追加できます

2.パラメータを渡す方法:
1)いわゆるモデルは抽象的です

2)オブジェクト=クラス名()

3)プロセス:
(1)クラス名():最初にオブジェクトが作成され、自己変数が作成されます
(2)initメソッドが呼び出され、クラス名の括弧内のパラメーターがここで受信されます
(3)initメソッド実行されます
(4)自己オブジェクトを返す、自己は特別な大きな辞書です

# __init__,调用,执行
class A:
    count = 0
    def __init__(self):
        A.count += 1
f1 = A()
f2 = A()
print(f1.count)  # 2
print(f2.count)  # 2
class A:
	def __init__(self, a):
		self.a = a

	def func(self):
		print(self.a)
		print(self.b)
		print(self.c)

a = A(2)
a.b = 44  # 可以给实例化对象动态添加类的属性
a.c = 55
a.func()  # 2  44  55
print(a.__dict__)  # {'a': 2, 'b': 44, 'c': 55}  查看实例化对象的所有属性
print(A.__dict__)  # {'__module__': '__main__', '__init__' ... ...} 查看类的所有方法

3.クラス内のローカル変数の場合、変数データタイプの変更は共有され、不変データタイプの変更はインスタンス化されたオブジェクトに制限されます。

class A:
	name = ['wang']  # 可变数据类型
	age = 22         # 不可变数据类型
	def __init__(self, *args):  # args : ()
		self.a = args[0]

	def func(self):
		# 类的局部变量,函数内可以这样调用
		print(A.name, A.age)  # ['wang']  22
		print(self.a)
		print(self.b)
		print(self.c)
print('-----', A.name)  # ----- ['wang']
a = A(2)
a.b = 44  # 可以给实例化对象动态添加类的属性
a.c = 55
a.func()  # 2  44  55
a.name[0] = 'liu'  # 修改类中的变量
a.age = 18
# 可变数据类型修改是共享的(类和实例化对象共享),不可变数据类型修改不共享,只在自己的实例化对象有效
print(a.name, a.age)      # ['liu']  18
print(A.name, A.age)      # ['liu']  22
print(a.__dict__)  # {'a': 2, 'b': 44, 'c': 55, 'age': 18}  查看实例化对象的所有属性
# 查看类的所有方法和属性
print(A.__dict__)  # {'__module__': '__main__', 'name': ['liu'], 'age': 22, '__init__' ...}

クラス内のローカル変数には、クラス名でアクセスできます

class A:
	name = ['wang']  # 可变数据类型
	age = 22         # 不可变数据类型
	def __init__(self, *args):  # args : ()
		self.a = args[0]

	def func(self):
		# 类的局部变量,函数内可以这样调用
		print(A.name, A.age)  # ['wang']  22
		print(self.a)
		print(self.b)
		print(self.c)
print('-----', A.name)  # ----- ['wang']

4.クラスの定義は__init__である必要はありません

5.オブジェクト指向の3つの特性:継承、多態性、カプセル化

6.組み合わせ:オブジェクトの属性値は別のクラスのオブジェクトであり、クラスのインスタンス化されたオブジェクトをクラスの属性として使用できます。

7.クラスの継承:

# 一个类可以被多个子类继承
# 一个类也可以继承多个父类
class A:pass #父类,基类,超类
class B:pass #父类,基类,超类
class A_son(A,B):pass#子类,派生类
print(A_son.__bases__)  # (<class '__main__.A'>, <class '__main__.B'>)
print(A.__bases__)      # (<class 'object'>,) 默认继承隐藏超类object

複数の継承:クラスは複数の親クラスパスを継承します:A-> B-> C

# 多继承
class A:
    def func(self):print('A')
class B:
    def func(self):print('B')
class C:
    def func(self): print('C')
class D(A,B,C):
    pass
d = D()
d.func() #离的最近的func方法,应该是A的

ダイヤモンドの継承:2つの継承されたクラスは同じクラスを継承します

# 钻石继承 : 被继承的两个类继承同一个类
class A:
    def func(self):print('A')
class B(A):
    def func(self):print('B')
class C(A):
    def func(self): print('C')
class D(B,C):
    pass
# 继承路径 D -> B -> C -> A
d = D()
d.func() #离的最近的func方法,因该是B的,若B中没有func该找C的若B,C中都没有,该找A的

ファンネル継承:2つの継承されたクラスは異なるクラスを継承します

class A:
    def func(self):print('A')
class E:
    def func(self):print('E')
class B(A):
    def func(self):print('B')
class C(E):
    def func(self): print('C')
class D(B,C):
    pass
print(D.mro())  #可记录继承路径 D -> B -> A -> C -> E
d = D()
d.func() #离的最近的func方法,应该是B的,若B中没有func,该找A的,若A中也都没有该找C的

(1)クラシッククラスの深さ最初のpython2.7新しいスタイルのクラシックな共存、新しいスタイルのクラスはオブジェクトを継承する必要があります
(2)新しいスタイルのクラスの幅は最初のpython3.7には新しいスタイルのクラスのみがあり、デフォルトの継承オブジェクト、mro、スーパーメソッドは新しいスタイルのクラスでのみ使用可能です、スーパーのみ
(3)python3.7にはsuperの本質があります。親を直接探すのではなく、呼び出し元のノード位置の幅の優先順位に従います。

ダイヤモンドの継承:
ここに写真の説明を挿入

# 菱形继承:继承的两个类分别继承不同的类,不同的类又继承同一个类
# 类的先后顺序不可以交换
class F:
    def func(self): print('F')
class A(F):
    def func(self):print('A')
class B(A):
    def func(self):print('B')
class E(F):
    def func(self): print('E')
class C(E):
    def func(self):print('C')
class D(B,C):
    pass
print(D.mro())  #可记录继承路径 D -> B -> A -> C -> E -> F
d = D()
d.func() #离的最近的func方法,应该是B的,若B中没有func,找A的,A没找C,C没找E,都没找F

インターフェイスクラスと抽象クラス:

1.抽象クラスの指定
一般に、単一の継承で実現できる関数は同じであるため、親クラスに
複数の継承状況を実装するための簡単な基礎がいくつかあります。関数はより複雑であるため、同じ関数を抽象化するのは簡単ではありません。特定の実装は親クラスで記述されます

2.抽象クラスまたはインターフェースクラス:オブジェクト指向の開発仕様
(1)pythonにはインターフェースクラスはありません:javaにはインターフェースインターフェースの概念があります
(2)Pythonには複数の継承が付属しているため、クラスを直接使用してインターフェースクラスを実装します
( 3)pythonでの抽象クラスのサポート:一般に、単一の継承はインスタンス化できません
(4)多態性Pythonは本質的に多態性(動的に強く型付けされた言語)をサポートします

3.アヒルの種類
(1)継承に基づく類似性を尊重しないでください。
(2)独自のコードを実装する必要があります。
(3)2つのクラスがまったく類似している場合、親クラスのサブクラス間の兄弟関係は発生しません。これはアヒルのタイプです。
例:タプルリストこの類似性は、親クラスではなく、自分でコードを作成するときに制約されます。
(4)利点:緩い結合は、類似する各クラスに影響を与えません。

インターフェイスクラス
Pythonはサポートしていません。デフォルトは複数の継承です。すべてのメソッドを実装してはなりません。

# 接口类
from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta):     # 元类 默认的元类 type
    @abstractmethod
    def pay(self):
        raise NotImplemented          # 没有实现这个方法

class Wechat:
    def pay(self, money):
        print('微信支付了%s元'%money)
class Alipay:
    def pay(self, money):
        print('支付宝支付了%s元'%money)
class Applepay:
    def fuqian(self, money):        # 这个类没有pay这个方法
        print('Applepay支付了%s元'%money)

def pay_for(pay_obj, money):        # 统一支付入口
    pay_obj.pay(money)

wechat = Wechat()
ali = Alipay()
apple_pay = Applepay()
pay_for(wechat, 200)     # 微信支付了200元
pay_for(ali, 300)        # 支付宝支付了300元
# pay_for(apple_pay, 100)  # 报错 'Applepay' object has no attribute 'pay'

抽象クラス:
Pythonサポート、複数の継承をサポートしていません

from abc import abstractmethod,ABCMeta
class Swim_Animal(metaclass=ABCMeta):
    @abstractmethod
    def swim(self):
        pass
swim_animal = Swim_Animal()
class Walk_Animal(metaclass=ABCMeta):
    @abstractmethod
    def walk(self):
        pass
walk_wnimal = Walk_Animal()
class Fly_Animal(metaclass=ABCMeta):
    @abstractmethod
    def fly(self):
        pass
fly_animal = Fly_Animal()

class Tiger(Walk_Animal,Swim_Animal):
    def walk(self):
    	pass
    def swim(self):
        pass
class Swan(Walk_Animal,Fly_Animal,Swim_Animal):pass

tiger = Tiger()
tiger.walk()

静的メソッド:
完全にオブジェクト指向のプログラムで、関数がオブジェクトまたはクラスと関係がない場合は、staticmethodを使用してこの関数を静的メソッドに変換します

class Login:
    def __init__(self,name,password):
        self.name = name
        self.pwd  = password
    def login(self):
        pass
    @staticmethod
    def get_usr_pwd():   #没有默认参数,就像函数一样
        usr = input('用户名:')
        pwd = input('密码:')
        Login(usr,pwd)
Login.get_usr_pwd()

カプセル化:
1。広い意味でのオブジェクト指向のカプセル化:コード保護、オブジェクト指向の思考自体は一種のカプセル化です
2.独自のクラスのメソッドを呼び出すことができるのは自分のオブジェクトだけです
3.狭い意味でのカプセル化–3つのオブジェクト指向の機能
4 、属性とメソッドはあなたから隠されています

テストケース:
1。次のコードの出力は次のとおりです。#20、10、なし

a = 10
b = 20
def func(a, b):
	print(a, b)
c = func(b, a)
print(c)  # 20, 10, None 无返回值return

2.文字列内の数値の合計を見つけます。

# 正则匹配求和  + 1-n次  ? 0-1次  * 0-n次
# 方法一
import re
s='123.33sdhf3424.34fdg323.324asda123'
p = r'\d+\.?\d*'
r = re.findall(p, s)   # ['123.33', '3424.34', '323.324', '123']
print(sum([float(i) for i in r]))  # 3993.994
# 方法二
import re
s='123.33sdhf3424.34fdg323.324asda123'
p = r'\d+\.?\d*'
r = re.findall(p, s)
r = '+'.join(r)
print(r)        # '123.33+3424.34+323.324+123'
print(eval(r))  # 3993.994  eval()函数求值

3.出力値は、リストを形成するためのリストタイプのキーです。

# 输出字典中值为list的key
d={'k1':'v1','k2':[1,2,3],('k','3'):{1,2,3}}
ret = [k for k in d if type(d[k]) is list]
print(ret)

4.マッチング方法

# strings字符串的筛选
# http开头的https开头的
# IP地址
import re
# if self.strings[k][1]
# 要不要匹配HTTP和HTTPS的,是开头match匹配还是全部search匹配
s = 'http://www.baidu.com'
s1 = 'https://www.163.com'
s3 = '/.,[,;],;ahm,ldshs'
# 从头开始匹配,开头为https和http
if re.match(r"http|https", s3):
	print(re.match(r"http|https", s3))
else:
	print('can not match')

# 匹配到是把IP提取出来,还是把原字符串存储下来
s2 = 'fsdf172.123.7.2sdfsg'
if re.findall(r'\d+\.\d+\.\d+\.\d+', s3):
	print(re.findall(r'\d+\.\d+\.\d+\.\d+', s3))
	print(re.findall(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', s3)) # 返回一个list
else:
	print('22222')

おすすめ

転載: blog.csdn.net/weixin_42563968/article/details/108548914