Pythonのベース(12):オブジェクト指向プログラミング

まず、オブジェクト指向

プログラム

  • 下の障壁に上からビジネスロジックコード:ためのプロセス。
  • 機能:パッケージの機能は、あなただけの関数を呼び出すことができ、あなたが書くために、将来的に繰り返す必要はない、機能します。
  • オブジェクト指向:関数の分類とパッケージング、開発者ができるように、「より速く、より良く、より強力な......」

オブジェクト指向とは何か:

        オブジェクト指向のプロセスは、機能指向モジュールとしては、これらのオブジェクトの分析参加者は、参加者は、オブジェクトの背後にあるこれらのソフトウェアシステムの参加者を識別するために、オブジェクトと呼ばれるソフトウェアシステムがあることが懸念されることにより、分割されていません特性、行動となるように、オブジェクト間の関係は何ですかオブジェクト指向開発のコアがある被験者は

カテゴリはどのようなものです:

        オブジェクト指向プログラミングの2つの非常に重要な概念:クラスとオブジェクト

        クラスは、同じ持つオブジェクトの種類である性質行動を総称して物事を。クラスは、抽象的、使用中に通常の特定のクラス見つけるとき、(存在しない)の存在を

オブジェクトとは何か:

        すべてのオブジェクトは、オブジェクトが独自の特性や行動を持っています。

クラスやオブジェクト間の関係:

        クラスはオブジェクトのタイプであり、オブジェクトは、クラスのインスタンスです。クラスは抽象概念であり、オブジェクトが有形ですが、実体を得ることができます。二人はなしで行うことができる人、お互いを補完します。

クラスは、3つの部分から構成されています。

  • クラスの名称:タイプ
  • プロパティ:オブジェクトのプロパティ
  • 方法:オブジェクト

第二に、作成と使用:

クラス定義:

class 类名:
    属性列表
    方法列表

例:

'''
类定义
class 类名():
    # 类文档说明
    属性
    方法
'''

class person():
    '''
    这是一个人类
    '''
    country = '中国'   # 声明类属性并赋值
    
    # 实例属性通过构造方法来声明
    # self不是关键字,代表的是当前对象
    def __init__(self, name, age, sex):     # 构造方法
        # 构造方法不需要调用,在实例化的时候自动调用
        print('我是构造方法,在实例化的时候调用')
        self.name = name            # 通过self创建实例属性,并且赋值
        self.age = age
        self.sex = sex
        
    # 创建普通方法
    def getName(self):
        print('我的名字叫:%s,我来自%s'%(self.name, person.country)) # 在方法里面使用实例属性
        
# 实例化对象
people1 = person('joe', 1, '男')  # 在实例化的时候传进参数
# 这个people1就要具有三个属性,并且可以使用getName方法

# 访问属性
print(people1.name)  # 通过对象名.属性名 访问实例属性(对象属性)

# 通过对象调用实例方法
people1.getName()
# output:我的名字叫:joe,我来自中国

__init __()コンストラクタと自己:

  • __init __()特別な方法であり、独自のメソッドがクラスに属し、コンストラクタクラスまたは初期化方法であって、正面の方法及び後部2つのアンダースコアと呼ばれます。
  • これはデフォルトのPythonの方法と共通メソッド名の競合が発生しないようにすることです。たび__のinit __()メソッドは、デフォルトで実行されます、のオブジェクトクラスのインスタンスを作成します。オブジェクトの役割は、初期化後にインスタンス化されます。
  • プロセス定義では、最初のパラメータは不可欠自己です。差分クラスのメソッドと正常な機能が自己である、自己がPythonのキーワードではありません、あなたは交換する他の単語を使用することができますが、実務と規格に従って、それは自己を使用することをお勧めします。

プロパティの分類クラス(人々がクラスを作成します):

  • クラスのプロパティ
  • インスタンス・プロパティ
  • クラス変数:クラス変数はインスタンス化されたオブジェクト全体で共通しています。そして、クラス変数はクラス内の関数の本体の外に定義されました。クラス変数は通常、インスタンス変数として使用されていません。必要に応じて、使用する機能クラス名。クラス属性を
  • 変数の例:プロセスで定義された変数、クラスの現在のインスタンスの役割のみ。

クラスのプロパティのいくつかの方法:

  • オブジェクト名をインスタンス化する+オブジェクトのプロパティにアクセスするために使用することができます
  • また、プロパティにアクセスするにはどのような機能な方法を使用することができます
'''
getattr(obj, name[, default]): 访问对象的属性
hasattr(obj, name): 检查是否存在一个属性
hasattr(obj, name, value): 设置一个属性。如果属性不存在,会创建一个新属性
delattr(obj, name): 删除属性
'''
print(getattr(people1, 'name'))  # output:joe
print(hasattr(people1, 'name'))  # output:True

setattr(people1, 'name', 'susan')
print(people1.name)     # output:susan

delattr(people1, 'name')
print(people1.name)         
# output:AttributeError: 'person' object has no attribute 'name'

ビルトインクラスの属性:

Pythonは組み込みのクラス属性:

  • __dict__:(辞書、クラスの属性の名前を含む:の値)クラス属性クラス名のインスタンス.__ dict__に
  • __doc__:クラスのドキュメンテーション文字列(クラス名)クラス名をインスタンス化する.__ doc__内の例題
  • __name__:クラス名、実装クラス名.__ name__
  • __bases__:親クラスを構成するすべての要素(親クラスのすべてのニューロン前駆を含みます)
'''
内置类属性
'''
print(people1.__dict__)
# output:{'age': 1, 'sex': '男', 'name': 'susan'}
# 会将实例对象的属性和值通过字典返回

print(people1.__doc__)
# output:这是一个人类

print(person.__name__)  # 返回类名
# output:person

print(person.__bases__)
# output:(<class 'object'>,)

 __名__

  • __name__:モジュールは、モジュールを配置した場合、そのモジュール名を意味し、それはクラスのクラスに配置されている場合、それはクラスの名前を意味します。
  • __main__:モジュール、xxx.pyファイル自体、それが直接実行されたときに、対応するモジュール名は__main__あります。もし__name__ ==で「__main__」することができます:あなたが追加したい、テストモジュールのために、モジュールは、コードなどの使用方法を示します。
  • モジュールは、他のPythonプログラム(インポート)に導入されると、モジュール名自体は、ファイル名XXXです。

 例:

1はname1.pyで、2つのファイルがあると仮定します。

def a():
    print('我是a方法')

print(__name__)
# output:__main__

出力:

別のファイルがname2.phです。

import name1

 出力:

試験した場合、name1.pyは次のように記述することができます。

def a():
    print('我是a方法')
if __name__ == '__main__':
    a()

それは、唯一の現在のスクリプトが実行されている、()他のスクリプトに導入されたときに()、実行されません実行します。

 

第三に、継承、ポリモーフィズム

継承:

        このプログラムは、継承は、猫や犬の動物から継承され、プログラムは、犬や猫のように記述することができるすべての動物がいるようなもの、との関係を所属について説明します。同様に、国内の猫とペルシャ猫はから継承されます。プログラム、私たちはクラスを定義するとき、彼らは既存のクラスを継承することができ、新しいクラスをサブクラス(サブクラス)と呼ばれているが、基底クラスは、クラスの親クラスまたはスーパークラスを継承と呼ばれています。サブクラスは、すべての属性とその親クラスのメソッドを継承していますが、独自のプロパティとメソッドをカスタマイズすることができます。

        Pythonの多重継承は、すなわち、サブクラス複数の親クラスを継承します。

class Animal():
    def __init__(self, name, food):
        self.name = name
        self.food = food
        
    def eat(self):
        print('%s爱吃%s'%(self.name, self.food))
        
# Dog类继承Animal
class Dog(Animal):          # python中的继承,只要把父类名写在括号里就行
    def __init__(self, name, food, drink):
        super().__init__(name, food)      # 加载父类中的初始化方法
        self.drink = drink
    def drinks(self):
        print('%s爱喝%s'%(self.name, self.drink))
        
# Cat类继承Animal
class Cat(Animal):
    def __init__(self, name, food, drink):
        super().__init__(name, food)
        self.drink = drink
    def drinks(self):
        print('%s爱喝%s'%(self.name, self.drink))
        
# 子类(Dog和Cat)继承了父类(Animal)的全部功能,自动拥有了父类的eat()方法
dog1 = Dog('小狗','骨头','肉汤')
dog1.eat()
dog1.drinks()

cat1 = Cat('小猫','鱼','牛奶')
cat1.eat()
cat1.drinks()

出力:

多重継承:

次のように多重継承構文でPythonは次のとおりです。

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    ...
    ...
    <statement-1>

        親クラスを見つけるために、左から右に親クラスが同じメソッド名を継承しているが、サブクラスで使用する場合、パイソンを指定しなかった場合は、括弧親で順序は、ああメソッドが含まれていることに注意してください。 

class A():
    def a(self):
        print('我是A里的a方法')
        
class B():
    def b(self):
        print('我是B里的b方法')
        
class C():
    def c(self):
        print('我是C里的c方法')
        
class D(A, B, C):
    def d(self):
        print('我是D里的d方法')
        
dd = D()
dd.a()
dd.b()
dd.c()
dd.d()

 出力:

第四に、クラスとインスタンスのプロパティ

属性:

        一例として、属性プロパティが、クラスのプロパティとプロパティの同じ種類を渡すために、ユーザーが必要とするようにしてください。すべてのインスタンスのプロパティにクラスを作成し、再度初期化され、異なるインスタンスの特性の例には、クラス属性の同一の、異なるインスタンスが等しいされないかもしれません。

例1.プロパティ:

        __init __で(自己、...)が初期化されます

        あなたは、自己の内部呼び出しを追加する必要があります。

        「オブジェクト名、属性名」外部呼び出しが呼び出すと

2.クラスのプロパティ:

        初期化__init __()で

        内部で使用するクラス名で。クラス名の呼び出し属性

        外部のいずれかのクラス名で呼ばれること。クラス属性名を、彼らはINSTANCENAMEを使用することができます。クラスの属性名

3.プライベートプロパティ:

        初めは、(1)二重下線__:変更するには、外部からのアクセスかどうか「オブジェクト名は、属性名」実は「属性名_ __クラス名」に変換しました

class person():
    '''
    这是一个人类
    '''
    country = '中国'   # 声明类属性并赋值
    
    # 实例属性通过构造方法来声明
    # self不是关键字,代表的是当前对象
    def __init__(self, name, age, sex, address):     # 构造方法
        # 构造方法不需要调用,在实例化的时候自动调用
        print('我是构造方法,在实例化的时候调用')
        self.name = name            # 通过self创建实例属性,并且赋值
        self.age = age
        self.sex = sex
        self.__address = address # 双下划线开头的属性是私有属性
        
    # 创建普通方法
    def getName(self):
        print('我的名字叫:%s,我来自%s'%(self.name, person.country)) # 在方法里面使用实例属性
        
# 实例化对象
people1 = person('joe', 1, '男')  # 在实例化的时候传进参数

# 通过对象名.属性名访问私有属性
print(people1.__address)

 输出:はAttributeError:「人のオブジェクトには属性「__address」がありません

        プライベートプロパティは、クラスだけで使用することができます!

または強制アクセス:

print(people1._person__address)

出力: 

または:外部脇に置き、私有財産を変更したり、私有財産を訪問する口実を変更するには。例えば、以下のような方法では、クラス内で適用されてもよいです。

def getAddre(self):
    return self.__address

 シングル下線、二重下線、二重下線ヘッドとテールの説明:

  • __foo__:定義は特別な方法、同様の__init __()などです。
  • _foo:下線の単始まる*は、(作成されたインスタンスにアクセスすることができる)、すなわち保護タイプは、それ自体およびサブクラスアクセスにそれをのみを許可することができ、変数の型を保護されたモジュールのInportから使用することができません
  • __foo:二重下線は、民間(プライベート)の変数の型を示すだけで、クラス自体へのアクセスを許可することができます。

第五に、アクセス制限

  • プライベートプロパティに設定し、オブジェクトのプロパティを介して直接アクセスすることはできませんが、から直接アクセスすることができ、「._ __オブジェクトのクラス名をインスタンスプロパティ名。」しかし、そうすることは推奨されません。Pythonインタプリタの異なるバージョンが異なる変数名に「__属性名」を提案するかもしれません。全体的に、Pythonは、意識的にすべてのおかげで悪いことをやってからあなたを停止する任意のメカニズムを持っていません。
  • 直接プライベートプロパティを変更するには、「オブジェクト名.__属性名」と。それが変わっ思わ表面には、実際には、ありませんでした。Pythonインタプリタオブジェクトの内部属性を持っているので名前が意味すると解釈「__ _クラス名は属性名。」あなたは別のプロパティの同等の外ステートメントを変更する場合。
people1.__address = '上海'
# 看上去改了,其实没有。你给当前对象声明了一个新属性

print(people1.__address)
print(people1.getAddre())

出力:

第六に、クラスメソッド、および静的メソッド 

1.一般的な方法:

def fun_name(self, ...):
    pass
外部用实例调用

2.静的メソッド:デコレータ@staticmethod装飾することにより

  • あなたは、インスタンスのプロパティにアクセスすることはできません
  • パラメータは、自己を渡すことはできません
  • しかし、クラスのインスタンスとは無関係のはの方法に依存しません
    # 创建一个静态方法
    @staticmethod
    def aa():           # 不需要传递实例
        print('我的名字叫:%s'%self.name)

people1 = person('joe', 1, '男')
people1.aa()

私たちは文句を言うでしょう:名「自己」が定義されていません

だから、あなただけのクラスのプロパティにアクセスすることができます

    # 创建普通方法
    def getName(self):
        print('我的名字叫:%s,我来自%s'%(self.name, person.country)) # 在方法里面使用实例属性
        
    # 创建一个静态方法
    @staticmethod
    def aa():           # 不需要传递实例
        print('我来自:%s'%person.country)

people1 = person('joe', 1, '男')
people1.aa()

出力:

3.メソッドのカテゴリ:@classmethod

  • あなたは、インスタンスのプロパティにアクセスすることはできません
  • パラメータは、(そのような区別のオブジェクトを表し、自己の代表インスタンスオブジェクト)CLSを渡され、鉱山プロパティを呼び出すためにこれを使用する必要があります:.のClクラスの属性名
    # 类方法
    @classmethod
    def bb(cls):        # class   也不是关键字
        # 类方法不能访问实例属性
        print('我的名字叫:%s'%cls.country)  # 就用cls访问类属性
        
people1 = person('joe', 1, '男')
people1.bb()

出力:

        静的メソッドとクラスメソッドは、クラスまたはインスタンスを介して呼び出すことができます。特長は、インスタンスのプロパティを呼び出していません。静的メソッドは、クラス名を使用して、引数を受け付けません。クラスのプロパティを

おすすめ

転載: blog.csdn.net/qq_26271435/article/details/89812826