オブジェクト指向プログラミング
プロセス指向: ビジネスロジックに基づいた上から下への基本コード
関数型: 特定の関数コードを関数にカプセル化し、後で再度記述することなく直接呼び出します
オブジェクト-指向性: 分類とカプセル化で関数を実行することで、開発が「より速く、より良く、より強力に」なります
# 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,即:输出类
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
class Foo: def __init__(self, name, age): # 构造方法 self.name = name self.age = age # 析构方法:在垃圾回收之前执行 def __del__(self): pass
class Foo: def __call__(self, *args, **kwargs): print('call') p = Foo() # 对象后面加括号执行 __call__ 方法 p() # 一个括号是类创建了一个对象 两个括号是去执行 __call__ 方法 Foo()() # 输出: call call
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__)
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
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 サイトの他の関連記事を参照してください。