オブジェクト指向のpythonのメンバー、メソッド、プロパティ、例外処理

クラスのプライベートメンバ

1.プライベートメンバーのどのような?

プライベート:使用する条件を満たしの一部のみ

  • プライベートクラス属性
  • 私有財産の対象
  • プライベートメソッド

ノーマル状態

class B:
    school_name = '老男孩教育'
    def __init__(self,name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age

class A(B): # A的父类是B,这个时候意味着A的实例化对象就可以使用B类中的所有属性或者方法

    class_name = 'python23'

    def func(self):
        print(self.class_name)
        print(self.name)
obj = A() # 实例化一个对象A
print(obj.class_name)
obj.func()# 通过实例化对象来执行A类中的方法
print(obj.school_name)

obj = A('alex', '男', 123)
obj.func() #调用A类中的func方法
print(obj.class_name) # 调用A类中的class_name
print(obj.school_name) # 调用B类中的school_name

プライベートメンバーは何ですか

class A:

    company_name = '老男孩教育'  # 静态变量(静态字段)
    __iphone = '1353333xxxx'  # 私有静态变量(私有静态字段)


    def __init__(self,name,age): #特殊方法

        self.name = name  #对象属性(普通字段)
        self.__age = age  # 私有对象属性(私有普通字段)

    def func1(self):  # 普通方法
        pass

    def __func(self): #私有方法
        print(666)


    @classmethod  # 类方法
    def class_func(cls):
        """ 定义类方法,至少有一个cls参数 """
        print('类方法')

    @staticmethod  #静态方法
    def static_func():
        """ 定义静态方法 ,无默认参数"""
        print('静态方法')

    @property  # 属性
    def prop(self):
        pass

クラスにプライベート静的属性(***)

フォーマット

__girlnum = '1个'

  • オブジェクトは、クラスの外にアクセスすることはできません、クラスが外部からアクセスすることができません
  • あなただけのクラス内からアクセスすることができます

内部アクセス方法:メソッドにパッケージして、obj.func()#の良心教育

クラスのプライベートメンバーは使用何ですか?

あなたには、いくつかのプライベートを設定するかなど、クラス、パスワード、暗号化、の外で使用しない場合は、プライベートメンバに設定することができます

# 私有静态属性
class  B:
    school_name = 'OldBoy'

class A(B):
    class_name = 'python23'
    
    _girlnum = '1个' # 我就是私有属性

    
    def func(self):
        # print(self.class_name)
        print(self.__girlnum)
obj = A() 实例化
print(obj.__girlnum) # 对象在类的外部不能访问,类在外部也不能访问print(A.__girlnum),这种就是私有属性
print(obj.func()) # 在类的内部可以访问
从类的外部调用
print(obj.calss_name)
从类的内容部调用
obj.func()

prin(obj.school_name) 对于类的共有静态属性,类的外部,累的内容部,派生类都可调用

3.オブジェクトのプライベートプロパティを設定します。

フォーマット:

self.__age = age #それはプライベートメンバーとなり、メソッドを定義します

obj.func()メソッドを呼び出します

  • クラスの外にはアクセスできません
  • クラスは内部で使用することができます
class  B:

    def __init__(self, name, age)
            self.name = name
            self.__age = age # 这就变成了私有成员了
    def func(self):
            print(self.__age)
            
print(obj.__age)#在类的外部是无法访问的
obj.func()# 在类的内部可以使用


#派生类
既想用子类也想用父类用super
子类打印父类属性,派生类中也不能访问

4.プライベートメンバーを拡大

クラスの内部プライベートメンバーに加えて、あなたは本当にそれにアクセスすることはできませんか?

class A:
        __girl_num = '1个'

print(A._dict_)
# 输出结果
'_A__girlnum'

print(A.__A_girlnum) # 这样是可以访问的,千万不要去访问

pythonのすべてのプライベートメンバーは、プライベートメンバーの前にあるプラス__クラス名は。だから、アクセス可能です

第二に、クラスメソッドと静的メソッド

メソッドは、クラス@classmethodを使用しています

  • オブジェクトのメソッドは、クラスのメソッドを結合するように改変されています
  • もちろん、この方法では、任意の静的クラス変数を参照することができます
  • あなたは、オブジェクトをインスタンス化することはできません、あなたが直接外部このメソッドを呼び出すために、クラス名を使用します

どのクラスのメソッドを使用するには?(***)

定義方法:@classmethod CLS

クラス名とオブジェクト名obj.a_func()呼び出しを使用してA.a_func():メソッドを呼び出します

class A:
        num = 1
    
    def func(self):
        print('实例方法')
    
    # 以下就是类方法
    @classmethod 
    def a_func(cls):
            print(f'cls-->{cls}')
            print('这就是类方法')

# 类方法的调用方法
obj = A()
A.func(obj) # self会得到obj这个对象
A.a_func()# 进行调用

ときにクラスメソッド?

  • 方法、自己が使用されていない自己デフォルトの単一パスを定義します。
  • そして、あなたは現在のクラス名で、このメソッドを使用するか、時間の名前にメモリ空間のこの種を使用しようとしています
  • あなたがインスタンス化する前に、クラスのプロパティを変更することを、あなたはこれを使用することができます

例:学生の数を数えます

class Student:
    count = 0
    def __init__(self, name):
        self.name = name
        self.count1()

    @classmethod
    def count1(cls):
        cls.count += 1

    @classmethod
    def print1(cls):
        return cls.count

ly = Student('李烨')
sq = Student('扫强')
sq1 = Student('扫强')
sq2 = Student('扫强')
sq3 = Student('扫强')
sq4 = Student('扫强')

print(f'学生共计: {Student.print1()}个')

# 输出结果
学生共计: 6个

静的メソッド(***)

使用

クラス構造に配置されたクラスに依存し、また被写体に、彼は正常な機能ですしない、より明確かつ合理的です。

どのように使用するには?

@staticmethod:静的メソッドを定義します

A.static_func():静的メソッドを呼び出します

class A:
        def func(self):
                print(111)
        @classmethod
        def a_func(cls):
                print(cls)
        @staticmethod
        def static_func(a,b,c): # 也可以传参,就当做一个函数用就行
                print('静态方法')
        
A.static_func() # 类调用静态方法

obj = A()
obj.static_func(1,2,3)

为什么这种函数不写到类的外面?
也用不着类中的内容,但是为了划分,还是要放置于类中,显得与结构更加清晰与合理

切记在函数中要用return的方法返回值进行打印.

第三に、プロパティ(迷彩)

使用

この方法は、プロパティを装ったが、それは合理的な表示されます

opertyは、特別なプロパティであり、いくつかの機能(関数)のアクセスを実行し、値を返します

問題の例

class Bmi:

    def __init__(self, hight, shoot):
        self.hight = hight
        self.shoot = shoot

    def bmi(self):
        BIM = self.shoot/self.hight**2
        return BIM

obj = Bmi(1.75,67)
print(obj.bmi())

# 输出结果
21.877551020408163

どのようにプロパティを使用するには?

@property:プロパティをカモフラージュ

プロパティを呼び出します。obj.bmiは、プロパティのように見える実行方法ではなく、法のルックスから、括弧なしで直接実行

偽装するコードの上部、私たちは財産を装っBMIをしたいです

class Bmi:

    def __init__(self, hight, shoot):
        self.hight = hight
        self.shoot = shoot
        
        @property
    def bmi(self):
        BIM = self.shoot/self.hight**2
        return BIM

obj = Bmi(1.75,67)
print(obj.bmi) #不用加括号了
# 输出结果
21.877551020408163

迷彩プロパティは、3 @property @ aaa.setter @ aaa.delterあり

1. 先伪装 obj.bmi()变成obj.bmi @property \n def aaa(self): \n print('get的时候执行我')
2. @aaa.setter  --> def aaa(self,v): \n print('修改的时候执行我') --> obj.aa = '太白' # 结果: 太白 aaa三者必须是一致的
3. @aaa.delter --> def aaa(self): \n print('删除的时候执行我') del Bmi.bmi

注意事項:

  • あなたのオブジェクトのプロパティを設定すると、同じ名前の特定のプロパティを表示することはできません属性
  • セッター、デリータ2つの装飾的なデコレータ機能は、リターンを使用することはできません

そして、オブジェクト指向の機能の違い

四、でisinstance / issubclass /タイプ

でisinstance(B):B型(B派生クラス)インスタンス化されたオブジェクトによって決まります。

オブジェクトクラス決意との関係

class A:
        pass
    
class B(A):
        pass

obj = B()
print(isinstance(obj,B))
print(isinstance(obj,A))
# 输出结果
True
True
issubclass(M、N)は、ベースMの下位クラスN決定されます
class A:
        pass
    
class B(A):
        pass

class C(B):
print(isinstance(C,B))
print(isinstance(C,A))
# 输出结果
True
True

どのようなタイプですか?

型がプリミティブ型である、インスタンス化されたオブジェクト、Pythonとすべて1つのクラスで対象とされているクラスを決定するために使用されるデータの型がオブジェクトである、これはクラスオブジェクトはクラスによってインスタンス化さ間違いです。

すべてのクラスでのpython、同様にリストSTRのほとんどと、作成したので、これらのクラスは元のクラスのタイプからインスタンス化されているように来ます

Pythonの継承されたオブジェクトクラスは、新しいクラスです。

だけでなく、元のオブジェクトクラスのタイプによってインスタンス化されてきます

第五に、例外処理

何の異常です

あなたのプログラムの中断は、中断プロジェクト全体で、その結果、軒並み獲得します。

エラーの種類

構文エラー

自身避けるために、あなたのコードでは表示されません

ロジックエラー

l1 = [1,2,3]
print(l1[4]) #超过了取值范围

例外ハンドラ

  • 例外処理の場合:欠点、ネストされたあまり、あまりにも複雑、単純な例外処理
  • シンプルトライトライ付き

(***)してみてください

上から下へ、エラーメッセージ、および排水、だけでなく、転換の役割をキャプチャします

シングルエラーが複数除くことを除いて、分岐とマルチブランチを設定することです

例外のタイムリーな解決には、プログラムを中断しないようにします

status_dic = {
    1: 111,
    2: 333,
    3: 444,

}
while 1:
    try:

        num = input('请输入序号')
        int(num)
        print(status_dic[int(num)])

    except KeyError as e:
        print('选项超出范围,重新输入')
    except ValueError as e:
        print('请输入数字')

異常ユニバーサル

status_dic = {
    1: 111,
    2: 333,
    3: 444,

}
while 1:
    try:

        num = input('请输入序号')
        int(num)
        print(status_dic[int(num)])

    except Exception as e:
            print(e)
print(111)

異常な普遍的な使用する場合は、ときマルチブランチを使用するには?

  • あなたはこの例外を処分したい場合は、普遍的な異常で、プログラムは継続し、この時間を聞かせて
  • 例外が発生した場合、あなたは論理フローの異なる例外に応じて異なる実行するには、多分岐を取らなければなりません

ユニバーサルマルチブランチ+

status_dic = {
    1: 111,
    2: 333,
    3: 444,

}
while 1:
    try:

        num = input('请输入序号')
        int(num)
        print(status_dic[int(num)])

    except KeyError as e:
        print('选项超出范围,重新输入')
    except ValueError as e:
        print('请输入数字')
     except Exception:
                pass

例外処理の他のメンバー

status_dic = {
    1: 111,
    2: 333,
    3: 444,

}
while 1:
    try:

        num = input('请输入序号')
        int(num)
        print(status_dic[int(num)])

    except KeyError as e:
        print('选项超出范围,重新输入')
    except Exception:
                pass
# else
status_dic = {
    1: 111,
    2: 333,
    3: 444,

}
while 1:
    try:

        num = input('请输入序号')
        int(num)
        print(status_dic[int(num)])

    except KeyError as e:
        print('选项超出范围,重新输入')
    except Exception:
                pass
        else: # 不出现异常执行,如果出现异常就不执行
                print(666)
# finally
status_dic = {
    1: 111,
    2: 333,
    3: 444,

}
while 1:
    try:

        num = input('请输入序号')
        int(num)
        print(status_dic[int(num)])

    except KeyError as e:
        print('选项超出范围,重新输入')
    except Exception:
                pass
        finally: # 在异常发生之前执行finally
                print('执行finally')

使用シナリオ:

  • ファイル操作

目的は、エラーの前に、ファイルハンドルを閉じています

方法:

try:

    xxx

    xxx

finally:
      print('哈哈哈哈')
    f.close()
f = open('register', mode='w')
f.write('fdjsaklfd')
f.write('fdjsaklfd')
f.write('fdjsaklfd')
l1 = [1,2,3]
print(l1[1000])
f.write('fdjsaklffjdsklaf')

f.close()

try:
    f = open('register', mode='w')
    f.write('fdjsaklfd')
    f.write('fdjsaklfd')
    f.write('fdjsaklfd')
    l1 = [1, 2, 3]
    print(111)
    print(l1[1000])
    f.write('fdjsaklffjdsklaf')
finally:
    print('哈哈哈哈')
    f.close()
  • データベースエンジンに接続します

最終的には機能で

def func():
        try:
                a = 1
                b = 2
                return a + b
        finally:
                print(666)
func()
                

イニシアティブ投げ

例外を発生させる( 'sdfasdf')

断言

assert 条件  # 源码上assert.
assert 1 == 2
print(11)
print(22)
print(33)

カスタム例外

TypeError

class Connection(BaseException):

    def __init__(self,msg):
        self.msg = msg


raise Connection('触发了连接异常')
# 异常处理总结:
# 异常处理不能经常使用:异常处理耗费性能.有些错误是需要进行分流使用.代码的可读性变差.
# 关键节点使用.

おすすめ

転載: www.cnblogs.com/zanao/p/11227568.html