『ゼロ基礎入門学習Python』第040講:クラスと対象:いくつかの関連BIF

7156 ワード

目次
0.この授業で学んだことを書いてください.フォーマットは限らず、思い出と復唱は記憶を強化する良い方法です.
テスト問題
0.あるクラスが別のクラスのサブクラスであるかどうかをどのように判断しますか?
1.オブジェクトaがクラスAのインスタンスオブジェクトであるかどうかをどのように判断しますか?
2.アクセスオブジェクトが存在しない属性(異常が発生しない)を優雅に回避するにはどうすればいいですか?
3.PythonのBIFの一部はおかしいが、非常に役に立つ.すみません、property()関数の役割は何ですか?
4.プログラムが正常に動作するように、次のコードを追加してください.
5.自習【Python拡張読解】Python関数修飾子(装飾器)の使用により、修飾子を使用して以下のコードを修正する.
[原句]本当に修飾子の使い方を理解していますか?では、次のコードを書いてください.修飾子の同等の形式は使用されていません.
7.独学で【Python拡張読解】propertyの詳細な使い方を学び、4番目の問題のコードを「属性修飾子を使って記述子を作成する」ように修正することで実現する.
0.この授業で学んだことを書いてください.フォーマットは限らず、思い出と復唱は記憶を強化する良い方法です.
今日はクラスとオブジェクトに関するBIF,すなわち組み込み関数について述べる.
(一)issubclass(class,classinfo)
最初のパラメータclassが2番目のパラメータclassinfoのサブクラスである場合、Trueを返します.この関数についていくつか注意する必要があります.
  • クラスは、それ自体のサブクラスとみなされる
  • である.
  • classinfoはクラスオブジェクトからなるメタグループであり、classが候補クラスの1つであるサブクラスである限りTrue
  • を返す.
    (二)isinstance(object,classinfo)
    インスタンスオブジェクトobjectがクラスclassinfoに属しているかどうかを確認します.この関数についていくつか注意する必要があります.
  • 最初のパラメータがオブジェクトでない場合、False
  • は常に返されます.
  • 2 2 2番目のパラメータがクラスまたはクラスオブジェクトからなるメタグループでない場合、TypeError異常
  • が投げ出される.
    また、Pythonでは、オブジェクトにアクセスするためのBIFのプロパティがいくつか用意されています.
    (3)hasattr(object,name)attr=attribute:属性.
    オブジェクトに指定したプロパティがあるかどうかをテストします.nameは引用符で属性名を引きます.
    >>> class C:
    	def __init__(self, x = 0):
    		self.x = x
    
    		
    >>> c1 = C()
    >>> hasattr(c1, "x")
    True
    >>> hasattr(c1, x)
    Traceback (most recent call last):
      File "", line 1, in 
        hasattr(c1, x)
    NameError: name 'x' is not defined

    (四)getattr(object,name[,default])
    オブジェクトが指定した属性値を返します.指定した属性が存在しない場合、defaultを設定している場合は、このdefaultパラメータが印刷されます.そうしないと、AttributeError異常が放出されます.
    >>> class C:
    	def __init__(self, x = 0):
    		self.x = x
    
    		
    >>> c1 = C()
    >>> getattr(c1, 'x')
    0
    >>> getattr(c1, 'y')
    Traceback (most recent call last):
      File "", line 1, in 
        getattr(c1, 'y')
    AttributeError: 'C' object has no attribute 'y'
    >>> getattr(c1, 'y', '          ')
    '          '

    (五)setattr(object,name,value)
    オブジェクトで指定した属性の値を設定します.指定した属性が存在しない場合、新しい属性が作成され、割り当てられます.
    >>> setattr(c1, 'y', '      ')
    >>> getattr(c1, 'y', '          ')
    '      '

    (六)delattr(object,name)
    オブジェクトで指定した属性を削除し、属性が存在しない場合はAttributeError例外を放出します.
    俗に言うように、大通りはローマに通じている.Pythonは実際にはいくつかの方法を提供しています.propertyはBIFで、属性設定によって属性を設定します.
    property(fget = None, fset = None, fdel = None, doc = None)
    property関数の役割は属性を設定することであり、この属性は定義された属性を設定することであり、その最初のパラメータfgetは属性を取得する方法であり、最初のパラメータfsetは属性を設定する方法であり、最初のパラメータfdelは属性を削除する方法である.例:
    >>> class C:
    	def __init__(self, size = 10):
    		self.size = size
    	def getSize(self):
    		return self.size
    	def setSize(self, value):
    		self.size = value
    	def delSize(self):
    		del self.size
    	x = property(getSize, setSize, delSize)
    
    	
    >>> c1 = C()
    >>> c1.x
    10
    >>> c1.getSize()
    10
    >>> c1.x = 18
    >>> c1.getSize()
    18
    >>> c1.setSize(20)
    >>> c1.x
    20
    >>> del c1.x
    >>> c1.getSize()
    Traceback (most recent call last):
      File "", line 1, in 
        c1.getSize()
      File "", line 5, in getSize
        return self.size
    AttributeError: 'C' object has no attribute 'size'

    propertyの利点:例を挙げると、上記の例では、このプログラムはゆっくりと複雑に書かれています.ある日、このプログラムを大きく変更して、関数名を書き換えたいと思っています.propertyがなければ、ユーザーに提供された呼び出しインタフェースを西洋薬で修正すると、ユーザー体験が低下しますが、propertyがあれば、問題は存在しません.ユーザに提供されるインタフェースはすべてxであるため,プログラム内でどのように修正してもproperty内のパラメータは変更され,ユーザはxを呼び出してsize属性を設定したり取得したりするだけでよい.
    テスト問題
    0.あるクラスが別のクラスのサブクラスであるかどうかをどのように判断しますか?
    答え:issubclass(class,classinfo)関数を使用して、最初のパラメータ(class)が2番目のパラメータ(classinfo)のサブクラスである場合はTrueを返します.そうでない場合はFalseを返します.また、以下の常識を知っておくべきです.
  • クラスは、それ自体のサブクラスとみなされる
  • である.
  • classinfoはクラスオブジェクトからなる元祖であってもよく、classがいずれかの候補クラスのサブクラスと一致する限りTrue
  • を返す.
  • 他の場合、TypeError異常
  • が放出されます.
    1.オブジェクトaがクラスAのインスタンスオブジェクトであるかどうかをどのように判断しますか?
    答え:isinstance(object,classinfo)関数を使用し、最初のパラメータ(object)が2番目のパラメータ(classinfo)のインスタンスオブジェクトである場合はTrueを返し、そうでない場合はFalseを返します.また、以下の常識を知っておくべきです.
  • objectがclassinfoのサブクラスの一例である場合、条件
  • にも合致する.
  • 最初のパラメータがオブジェクトでない場合、False
  • は常に返されます.
  • classinfoはクラスオブジェクトからなる元祖であってもよく、classがいずれかの候補クラスのサブクラスと一致する限りTrue
  • を返す.
  • 2 2 2番目のパラメータがクラスまたはクラスオブジェクトからなる元祖でない場合、TypeError異常
  • が放出される.
    2.アクセスオブジェクトが存在しない属性(異常が発生しない)を優雅に回避するにはどうすればいいですか?
    答え:二つの方法があります.1つ目はhasattr(object,name)関数を用いて属性が存在するかどうかを判断し、存在する場合は再アクセス(1番目のパラメータ(object)がオブジェクトであり、2番目のパラメータ(name)が属性名の文字列形式である).2つ目の方法は、getattr(object,name[,default])関数を直接使用してdefaultパラメータを設定することです(オブジェクトが指定した属性値を返し、指定した属性が存在しない場合はdefault(オプションパラメータ)の値を返します).
    3.PythonのBIFの一部はおかしいが、非常に役に立つ.すみません、property()関数の役割は何ですか?
    答え:property()関数を使用すると、プログラミング担当者が属性アクセスを簡単かつ効果的に管理できます.
    4.プログラムが正常に動作するように、次のコードを追加してください.
    class C:
        def __init__(self, size=10):
            self.size = size
    
        def getXSize(self):
            return self.size
    
        def setXSize(self, value):
            self.size = value
    
        def delXSize(self):
            del self.size
    
            #           ,        
    
    >>> c.x
    10
    >>> c.x = 12
    >>> c.x
    12
    

    答:x=property(getXSize,setXSize,delXSize)
    5.自習【Python拡張読解】Python関数修飾子(装飾器)の使用により、修飾子を使用して以下のコードを修正する.
    コードA:
    class CodeA:
        def foo():
            print("       foo()")
    
            #   foo()          
            foo = staticmethod(foo)
    

    コードB:
    class CodeB:
        def foo(cls):
            print("      foo()")
    
            #   foo()         
            foo = classmethod(foo)
    

    答え:実は静的メソッドとクラスメソッドを設定するのはあまりにもツッコミが多いため、Pythonの著者は関数修飾子の形式の代替を開発した.
    コードA:
    class CodeA:
            @staticmethod
        def foo():
            print("       foo()")
    

    コードB:
    class CodeB:
            @classmethod
        def foo(cls):
            print("      foo()")
    

    [原句]本当に修飾子の使い方を理解していますか?では、次のコードを書いてください.修飾子の同等の形式は使用されていません.
    @something
    def f():
        print("I love FishC.com!")
    

    答え:実はPythonの修飾子は優雅なパッケージですが、モジュールやクラス定義内で関数を修飾するだけで、クラスを修飾することはできません.
    修飾子は、修飾された関数をパラメータとし、修飾された同名の関数または他の呼び出し可能なものを返す関数です.
    @something
    def f():
        print("I love FishC.com!")
    
    #    
    
    def f():
        print("I love FishC.com!")
    
    f = something(f)
    

    7.独学で【Python拡張読解】propertyの詳細な使い方を学び、4番目の問題のコードを「属性修飾子を使って記述子を作成する」ように修正することで実現する.
    答え:記述子を聞いたことがないかもしれませんが(この概念は次のいくつかの授業を終えると自然に理解されます)、この点は賢いあなたがこのプログラムを修正することに影響します.
    コードリスト:
    class C:
        def __init__(self, size=10):
            self.size = size
            
        @property
        def x(self):
            return self.size
    
        @x.setter
        def x(self, value):
            self.size = value
    
        @x.deleter
        def x(self):
            del self.size