オブジェクト指向による自動運用保守の詳しい解説 Pythonシリーズ

高洛峰
リリース: 2017-03-26 18:53:33
オリジナル
1823 人が閲覧しました

オブジェクト指向プログラミング

プロセス指向: ビジネスロジックに基づいた上から下への基本コード

関数型: 特定の関数コードを関数にカプセル化し、後で再度記述することなく直接呼び出します

オブジェクト-指向性: 分類とカプセル化で関数を実行することで、開発が「より速く、より良く、より強力に」なります

# Java や C# などのプログラミング言語はオブジェクト指向プログラミングのみをサポートしますが、Python は関数型プログラミングと関数型プログラミングの混合をサポートします。オブジェクト指向プログラミング

オブジェクト指向の例

# 函数式编程
def bar():
    print('bar')
  
bar()  # 直接调用函数
# 面向对象编程
class Foo:  # 创建类
   
    def bar(self):  # 在类里面定义函数 这里self是一个特殊的参数 创建对象时Foo将自身传进来
        print('bar')
  
obj = Foo()  # 创建一个对象
obj.bar()  # 由对象去访问类里面函数
ログイン後にコピー

オブジェクト指向の 3 つの主要な機能: カプセル化、継承、ポリモーフィズム

カプセル化

必要なコンテンツを作成したクラスにカプセル化し、必要に応じて呼び出します

class Foo:  # 创建类
  
    def __init__(self, name, age):  # Foo接收到两个参数后会封装在自己类内部
        self.name = name
        self.age = age
  
  
obj = Foo('kobe', 18)  # 创建一个对象 传两个参数
print(obj.name, obj.age)  # 外面调用封装好的参数
  
输出:
kobe 18
ログイン後にコピー

クラスメンバー

フィールド: 通常のフィールド、静的フィールド

メソッド: 通常のメソッド、静的メソッド、クラスメソッド

属性: 通常の属性

1) フィールド (クラス内にカプセル化されたパラメーター)

class Foo:
    # 字段(静态字段 保存在类里面)
    CC = "中国"
    def __init__(self, name):
        # 字段(普通的字段 保存在对象里面)
        self.name = name
  
# 普通字段通过对象访问
obj = Foo('上海')
print(obj.name)
# 静态字段通过类访问
print(Foo.CC)
ログイン後にコピー

2) メソッド (関数)クラスにカプセル化されています)

class Foo:
  
    def show(self):
              # 普通方法:对象调用执行 方法属于类
        print(self.name)
  
    @staticmethod
    def f1():
        # 静态方法 由类调用执行
        print('f1')
  
    @classmethod
    def f2(cls):  # class 自动给类名传进去了
        # 类方法
        # cls 是类名 加()创建对象
        print(cls)
  
# 创建对象
obj = Foo()
# 通过对象去访问普通方法 
obj.show()
# 通过类去访问静态方法
Foo.f1()
# 类方法 会将类 Foo 名字直接传入函数
Foo.f2()
ログイン後にコピー

3) 属性

クラスの属性を定義する前に、クラス内のメソッドにアクセスするときにメソッド名の後に括弧 () を追加する必要があります: 例: obj.f1()

属性を定義した後、クラス内のメソッドに直接アクセスできます obj.f1

class Foo:
    @property
    def f1(self):
        print('f1')
  
obj = Foo()
obj.f1  # 无需加括号直接通过对象访问
ログイン後にコピー

設定可能および削除可能

class Foo:
  
    @property  # 在类方法上加上 property装饰器 
    def f1(self):
        print('f1')
  
    @f1.setter  # 设置数值
    def f1(self, values):
        print(values)
  
    @f1.deleter  # 可删除
    def f1(self):
        print('del...')
  
obj = Foo()
obj.f1  # 无需加括号直接通过对象访问
  
obj.f2 = 100
del obj.f1
  
输出:
f1
del...
ログイン後にコピー

クラス属性を記述する別の方法

class Foo:
  
    def f1(self):
        return 100
  
    def f2(self, value):
        print(value)
  
    def f3(self):
        print('300')
       
    # 类属性定义
    Foo = property(fget=f1, fset=f2, fdel=f3)
  
obj = Foo()
  
# 取值
ret = obj.Foo
print(ret)
  
# 赋值
obj.Foo = 200
  
# 删除
del obj.Foo
  
# 输出
100
200
300
ログイン後にコピー

クラスメンバー修飾子

クラスメンバー修飾子: でフィールドまたはメソッドを定義しますクラスをパブリックまたはプライベートとして指定します

パブリックメンバー: どこからでもアクセスできます

プライベートメンバー: クラス内でのみアクセスできます

class Foo:
  
    __cc = 123
  
    def __init__(self, name):
        self.__name = name  # 加两个下划线__表示私有字段 外部、继承都不能调用
  
    def f1(self):
        print(self.__name)
  
    @staticmethod  # 加 staticmethod 装饰器表示为静态方法,可以不加self参数直接外部调用
    def f3(self):
        print(Foo.__cc)
  
obj = Foo('kobe')
# print(obj.__name)  # 通过对象外部访问内部普通字段不成功
obj.f1()
  
# print(Foo.__cc)  # 通过外部访问内部静态字段也不成功
obj.f3()
  
# 特殊访问方法
print(obj._Foo__name)
ログイン後にコピー

クラスの特別なメンバー

__doc__ #クラスの説明情報

__module__ #現在のオブジェクトがどのモジュールに属しているか

__class__ #現在のオブジェクトはどのクラスに属しているか

__str__ #オブジェクトを出力するときに返される値

__init__ #構築メソッド

__del__ #破壊メソッド

__call__ #トリガーの実行オブジェクトの後に括弧を追加する

__dict__ #クラスまたはオブジェクト内

__getitem__ のすべてのメンバー #辞書などのインデックス操作

__setitem__ #インデックス操作

__delitem__

6)__dict__

class Foo:
    """
    注释 __doc__
    """
obj = Foo()
print(obj.__doc__)
输出:
注释 __doc__
2)__module__ 和 __class__
from lib.aa import C
  
obj = C()
print obj.__module__  # 输出 lib.aa,即:输出模块
print obj.__class__      # 输出 lib.aa.C,即:输出类
ログイン後にコピー

6) __getitem__ __setitem__です辞書などのインデックス操作に使用されます: 値の取得、設定、削除ができます

class Foo:
  
    def __init__(self, name, age):  # 构造方法
        self.name = name
        self.age = age
    def __str__(self):  # str方法
        return '%s - %s ' % (self.name, self.age)
  
obj1 = Foo(name='kobe', age=18)
obj2 = Foo(name='jordan', age=18)
print(obj1)
print(obj2)
 
# 输出:
kobe - 18 
jordan - 18
ログイン後にコピー

7) __iter__、__isinstance__、__issubclass__

class Foo:
   
    def __init__(self, name, age):  # 构造方法
        self.name = name
        self.age = age
   
    # 析构方法:在垃圾回收之前执行
    def __del__(self):
        pass
ログイン後にコピー

super

super は、Python の多重継承の問題を解決し、メソッドを強制的に実行します。親クラス

class Foo:
  
    def __call__(self, *args, **kwargs):
        print('call')
  
p = Foo()
  
# 对象后面加括号执行 __call__ 方法
p()
# 一个括号是类创建了一个对象 两个括号是去执行 __call__ 方法
Foo()()
  
# 输出:
call
call
ログイン後にコピー

ソースコードを変更せずに関数を追加するにはsuperを使用してください

class Foo:
   
    def __init__(self, name, age):  # 构造方法
        self.name = name
        self.age = age
   
obj1 = Foo(name='kobe', age=18)
  
# 获取对象中封装的数据返回一个字典
ret = obj1.__dict__
print(ret)
# 输出:
{'name': 'kobe', 'age': 18}
  
# 全部的类方法
# print(Foo.__dict__)
ログイン後にコピー

順序付き辞書を実装するにはsuperを使用してください

class Foo:
  
    def __getitem__(self, item):
        print('getitem')
  
    def __setitem__(self, key, value):
        print('setitem')
print(item.start, item.stop, item.step)
  
    def __delitem__(self, key):
        print('delitem')
  
# 中括号语法自动执行 getitem 方法
obj = Foo()
obj['ab']
  
# 中括号并且赋值执行 setitem 方法
obj['k1'] = 111
del obj['k1']
  
# 切片也是去执行 setitem 方法
obj[1:6:2]
  
# 输出
setitem
delitem
getitem
1 6 2
ログイン後にコピー

シングルケースモード

# シングルトンモードは、一般的に使用されるソフトウェア設計パターンです。そのコア構造には、シングルトン クラスと呼ばれる特別なクラスが 1 つだけ含まれています。シングルトン モードでは、システム内にクラスのインスタンスが 1 つだけ存在し、外部からそのインスタンスに簡単にアクセスできるようにすることができるため、インスタンス数の制御が容易になり、システム リソースが節約されます。特定のクラスのオブジェクトを 1 つだけシステム内に存在させたい場合は、シングルトン パターンが最適なソリューションです。

class Bar:
    pass
  
class Foo(Bar):
     
    # 返回一个可迭代对象
    def __iter__(self):
        # return iter([11, 22, 33, 44])
        yield 1
        yield 2
  
obj = Foo()
for item in obj:
    print(item)
  
# 查看 obj 是否是 Foo 的实例
ret = isinstance(obj, Foo)
# 也可以查看是否是 父类 的实例
# ret = isinstance(obj, Bar)
print(ret)
  
# 查看 Foo 是否为 Bar 的子类
ret1 = issubclass(Foo, Bar)
print(ret1)
  
# 输出
1
2
True
True
ログイン後にコピー

例外処理

class C1:
  
    def f1(self):
        print('c1.f1')
  
class C2(C1):
  
    def f1(self):
        # 主动执行父类的 f1 方法
        super(C2, self).f1()
        print('c2.f1')
  
obj = C2()
obj.f1()
# 输出:
c1.f1
c2.f1
ログイン後にコピー

例外処理の完全なコード

目录
backend
  - commons.py
index.py
lib.py
setting.py
  
commons.py >>
class Foo:
    def f1(self):
        print('Foo.f1')
  
index.py >>
from setting import ClassName
from setting import Path
  
def execute():
    model = __import__(Path, fromlist=True)
    cls = getattr(model, ClassName)
    obj = cls()
    obj.f1()
  
if __name__ == '__main__':
    execute()
  
setting >>
# Path = "backend.commons"
# ClassName = 'Foo'
  
Path = "lib"
ClassName = 'MyFoo'
  
lib >>
from backend.commons import Foo
  
class MyFoo(Foo):
  
    def f1(self):
        print('before')
        super(MyFoo, self).f1()
        print('after')
这样运行我们自己添加的lib 时结果如下
before
Foo.f1
after
ログイン後にコピー

以上がオブジェクト指向による自動運用保守の詳しい解説 Pythonシリーズの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート