DISI 13高度なオブジェクト指向の2

ディレクトリ

DISI 13高度なオブジェクト指向の2

クラスパッケージ

パッケージ:、梱包までシール、アップロード

1.包装二つのレベル

1.最初のレベル:オブジェクトのようなものを得ることができますが、物事は、オブジェクトの種類にそれを得ることができますか?ここではカプセル化の層があります

class Foo():
    count = 0
    print(count)

f = Foo()
print(f.count)  # 0
f.name = 'nick'  # 对对象进行了封装
print(Foo.name)

2 **セカンドレベル:内部使用、外部の使用があなたの前にすることはできませんプロパティを必要とするプラスカプセル化__ **

class People():
    __love_people = 'male'
    print('in',love_people)

    def __nawan(self):
        print('nawan')
    def __nakuaizi(self):
        print('nakuaizi')
    def __chifan(self):
        print('chifan')

    def chifan_all(self):
        self.__nawan()
        self.__nakuaizi()
        self.__chifan()

print('out',People.__f1)

p  = People()
print('out',p.nawan())
print('out',p.nakuaizi())
print('out',p.chifan())

print('out',p.chifan_all())

3.使用することは何ですか、このパッケージ属性:クラス属性は他の人がアクセスしたくないの内側に隠れては、あなたのプライバシーを保護し、
4梱包の方法の利点は何ですか:コードを合理化し、あなたはラインchifanでこのメソッドを使用することで食事、あなたは他の操作を気にする必要はありませんし、外部の発信者は、あなたが内部の何が起こったのかわかりません

2.アプリケーション

print('*'*50)
class People:
    def __init__(self,pwd):
        self.__pwd = pwd
    @property  # 方法不用加括号使用
    def pwd(self):
        return f'无法获取你的密码'

p = People('123')
print(p.pwd)
print(p.pwd)
class F1:
    __count = 0

f = F1()
print(f._F1__count)  # 如果你真的要拿,_类名__属性去拿(不可能这样做)
class Foo:
    def f1(self):
        print('FOO.f1')
    def f2(self):  # foo
        print('Foo.f2')
        self.f1()

class Bar(Foo):
    def f1(self):
        print('Bar.f1')

foo = Bar()
foo.f2() # Foo.f2  # Bar.f1
class Foo:
    def __f1(self):  # _Foo__f1
        print('FOO.f1')
    def f2(self):  # foo
        print('Foo.f2')
        self.__f1()  # _Foo__f1
print(Foo.__dict__)
class Bar(Foo):
    def __f1(self):  # _Bar__f1
        print('Bar.f1')

bar = Bar()
bar.f2() # Foo.f2
# 封装其实在定义阶段就以己经执行了,会把私有属性__f1变成_Foo__f1,之后都不会做这种处理
class Foo():
    __count = 0

foo = Foo()
print(foo)


foo.__y = 1
print(foo.__y)

二、そのようなプロパティの特性

1. BMI(体格指数):ボディマスインデックス

男性の体脂肪の女性の> 25%> 33%が肥満標準と診断されています

class People():

    def __init__(self,height,weight):
        self.height = height
        self.weight = weight

    @property
    def bmi(self):
    return self.weight/(self.height**2)

peo = People(1.8,70)
print(peo.height)
print(peo.bmi())
print(peo.bmi)

(唯一のpython3で使用)2.デコレータの使用

1.propertyは、一般的に使用される:もともと方法が、彼は、それは我々が財産すべき時である属性

2.setattr和delattr

3.setattrとdelattrのみプロパティを変更し、削除することができ、これらの2つのメソッドを使用した後、それは、財産の使用であります

class People():

    def __init__(self,height,weight):
        self.height = height
        self.weight = weight

    @property  # 获取值的时候触发,你不需要加括号使用,不能加参数
    def bmi(self):
        return self.weight/(self.height**2)

    @bmi.setter  # 在修改bmi的时候触发,必须得加参数
    def bmi(self, value):
        print(f'你已经成功修改为{value}')

    @bmi.deleter  # 在删除bmi的时候触发,不能加参数
    def bmi(self):
        print('delter')

peo = People(1.8,70)
print(peo.bmi)

print('*'*50)
peo.bmi = 50

print('*'*50)
del peo.bmi

クラスプロパティの使用(のPython2)

第三に、結合方法のクラスとオブジェクトと非結合のアプローチ

この方法は、結合:1.結合方法を

class Foo:
    # 绑定给对象,只有对象能用,但是类也能使用,使用的时候必须得传参
    def f1(self):
        print(self)

    @classmethod  # 让被装饰的函数给类使用,约定俗称参数为cls
    # 绑定给类的方法,类能使用,对象也可以使用,但是参数依然是类
    def f2(cls):
        print(cls)

    # 什么都不绑定的,非绑定方法,定义了普通的函数
    @staticmethod
    def f3(self):
        print(self)

f = Foo()
f.f1()
Foo.f1(1111)

print('*' * 50)
Foo.f2()
f.f2()

print('*'*50)
Foo.f3(2222)
f.f3(2222)

2.使用するには?

  • このメソッドは、クラスメソッド、@、あなたはクラスのメソッドを使用する必要がある場合に結合パラメータとしてクラスを使用する必要があります
class A:
    def __init__(self,name):
        self.name = name

    @classmethod
    def cla_pri(cls):
        print(f'{cls.__name__},{cls}')

class B(A):
    pass

A.cla_pri()
B.cla_pri()
x = B('x')
x.cla_pri()
'''
A,<class '__main__.A'>
B,<class '__main__.B'>
B,<class '__main__.B'>

'''
  • あなたがオブジェクトバインディングのアプローチを使用する必要がある場合、このメソッドは、パラメータとしてオブジェクトを使用する必要があります
  • このメソッドは、パラメータとしてクラス、すなわちを必要とせず、パラメータとしてオブジェクトを必要としない、非結合法、@ staticmethod

IVの概要

1.パッケージ:隠された属性やメソッドは、本当に、引用属性名_ __クラス名を使用したいと思い、内部は実行するために、クラス定義の段階で使用することができ、外で使用することはできません

2.非表示機能/モジュール_x内の変数:モジュールのインポート*(インポートすることができない)から、モジュールのインポート_xから(無理)

プロパティ@ 3:@property装飾的な機能は、括弧を使用せずに、直接、関数からその関数名プロパティになります。

前記メソッド名@の.setter:機能@が変更されたメソッド名.setter装飾、メソッド名は、装飾機能を実行します

@bmi.setter
def set_bmi():
    print('setter')
peo.bmi = 40

メソッド名.deleter @ 5:メソッド名が削除された@関数.deleter装飾、メソッド名は、この装飾の機能を実行

@bmi.deleter
def del_bmi():
    print('deleter')
del peo.bmi

6.python2と呼ばれるクラス属性のメソッド

7.オブジェクトのバインド:まさかすると、メソッドをバインドされた装飾品を追加することです

8.クラスを結合する方法は:追加の結合方法@classmethodデコレータクラスです

非結合法:@staticmethodデコレータのメソッドを追加し、実際には、通常の関数非結合アプローチであります

おすすめ

転載: www.cnblogs.com/itboy-newking/p/11072038.html