2.1.2 Pythonのオブジェクトへの反射および組み込み方法

9209 ワード

クリックしてノートの総目次を回転します

目次を読む


1,isinstanceとissubclass


2、反射

  • setattr
  • delattr
  • getattr
  • hasattr

  • 3,__str__およびrepr


    4,__del__


    5,itemシリーズ

  • __getitem__
  • __setitem__
  • __delitem__

  • 6,__new__


    7,__call__


    8,__len__


    9,__hash__


    10,__eq__


    1,isinstanceとissubclass


    isinstance(obj,cls)objがクラスclsのオブジェクトかどうかをチェック
    class Foo(object):
         pass
      
    obj = Foo()
      
    isinstance(obj, Foo)
    

    issubclass(sub,super)subクラスがsuperクラスの派生クラスであるかどうかをチェック
    class Foo(object):
        pass
     
    class Bar(Foo):
        pass
     
    issubclass(Bar, Foo)
    

    2、反射


    ==1反射とは何か==反射の概念は1982年にSmithが初めて提案したもので、主にプログラムが自身の状態や行為にアクセス、検出、修正できる能力(自省)を指す.この概念の提出はすぐにコンピュータ科学分野の応用反射性に関する研究を引き起こした.それはまずプログラム言語の設計分野に採用され,Lispとオブジェクト向けの面で成績を収めた.==2 pythonオブジェクトへの反射:==オブジェクト関連のプロパティを文字列で操作します.pythonのすべてのものはオブジェクト(反射を使用することができます)4つの自省可能な関数です.以下の方法はクラスとオブジェクト(すべてオブジェクト、クラス自体もオブジェクト)hasattrに適用されます.
    def hasattr(*args, **kwargs): ## real signature unknown
        """
        Return whether the object has an attribute with the given name.
        This is done by calling getattr(obj, name) and catching AttributeError.
        """
        pass
    

    getattr
    def getattr(object, name, default=None): ## known special case of getattr
        """
        getattr(object, name[, default]) -> value
        
        Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
        When a default argument is given, it is returned when the attribute doesn't
        exist; without it, an exception is raised in that case.
        """
        pass
    

    setattr
    def setattr(x, y, v): ## real signature unknown; restored from __doc__
        """
        Sets the named attribute on the given object to the specified value.
        
        setattr(x, 'y', v) is equivalent to ``x.y = v''
        """
        pass
    

    delattr
    def delattr(x, y): ## real signature unknown; restored from __doc__
        """
        Deletes the named attribute from the given object.
        
        delattr(x, 'y') is equivalent to ``del x.y''
        """
        pass
    

    4つの方法の使用方法のデモ
    class Foo:
        f = ' '
        def __init__(self,name,age):
            self.name=name
            self.age=age
    
        def say_hi(self):
            print('hi,%s'%self.name)
    
    obj=Foo('egon',73)
    
    # 
    print(hasattr(obj,'name'))
    print(hasattr(obj,'say_hi'))
    
    # 
    n=getattr(obj,'name')
    print(n)
    func=getattr(obj,'say_hi')
    func()
    
    print(getattr(obj,'aaaaaaaa',' ')) # 
    
    # 
    setattr(obj,'sb',True)
    setattr(obj,'show_name',lambda self:self.name+'sb')
    print(obj.__dict__)
    print(obj.show_name(obj))
    
    # 
    delattr(obj,'age')
    delattr(obj,'show_name')
    delattr(obj,'show_name111')# , 
    
    print(obj.__dict__)
    

    3,strとrepr


    オブジェクトの文字列表示strを変更します.repr__ カスタムフォーマット文字列format
    #_*_coding:utf-8_*_
    
    format_dict={
        'nat':'{obj.name}-{obj.addr}-{obj.type}',# - - 
        'tna':'{obj.type}:{obj.name}:{obj.addr}',# : : 
        'tan':'{obj.type}/{obj.addr}/{obj.name}',# / / 
    }
    class School:
        def __init__(self,name,addr,type):
            self.name=name
            self.addr=addr
            self.type=type
    
        def __repr__(self):
            return 'School(%s,%s)' %(self.name,self.addr)
        def __str__(self):
            return '(%s,%s)' %(self.name,self.addr)
    
        def __format__(self, format_spec):
            ## if format_spec
            if not format_spec or format_spec not in format_dict:
                format_spec='nat'
            fmt=format_dict[format_spec]
            return fmt.format(obj=self)
    
    s1=School('oldboy1',' ',' ')
    print('from repr: ',repr(s1))
    print('from str: ',str(s1))
    print(s1)
    
    '''
    str print --->obj.__str__()
    repr --->obj.__repr__()
     __str__ , __repr__ 
     : , 
    '''
    print(format(s1,'nat'))
    print(format(s1,'tna'))
    print(format(s1,'tan'))
    print(format(s1,'asfdasdffd'))
    

    %sと%r
    class B:
    
         def __str__(self):
             return 'str : class B'
    
         def __repr__(self):
             return 'repr : class B'
    
    
    b=B()
    print('%s'%b)
    print('%r'%b)
    
    
    

    4,del


    オブジェクトがメモリから解放されると、自動的に実行がトリガーされます.
    注意:この方法は一般的に定義する必要はありません.Pythonは高度な言語であり、プログラマは使用時にメモリの割り当てと解放に関心を持つ必要はありません.この作業はPython解釈器に任せて実行されるため、構造関数の呼び出しは解釈器がゴミ回収を行うときに自動的にトリガーされます.==単純モデル==
    class Foo:
    
        def __del__(self):
            print(' ')
    
    f1=Foo()
    del f1
    print('------->')
    
    # 
     
    ------->
    
    
    

    5,itemシリーズ


    __getitem__ __setitem__ __delitem__
    class Foo:
        def __init__(self,name):
            self.name=name
    
        def __getitem__(self, item):
            print(self.__dict__[item])
    
        def __setitem__(self, key, value):
            self.__dict__[key]=value
        def __delitem__(self, key):
            print('del obj[key] , ')
            self.__dict__.pop(key)
        def __delattr__(self, item):
            print('del obj.key , ')
            self.__dict__.pop(item)
    
    f1=Foo('sb')
    f1['age']=18
    f1['age1']=19
    del f1.age1
    del f1['age']
    f1['name']='alex'
    print(f1.__dict__)
    

    6,__new__

    class A:
        def __init__(self):
            self.x = 1
            print('in init function')
        def __new__(cls, *args, **kwargs):
            print('in new function')
            return object.__new__(A, *args, **kwargs)
    
    a = A()
    print(a.x)
    

    単一モード
    class Singleton:
        def __new__(cls, *args, **kw):
            if not hasattr(cls, '_instance'):
                cls._instance = object.__new__(cls, *args, **kw)
            return cls._instance
    
    one = Singleton()
    two = Singleton()
    
    two.a = 3
    print(one.a)
    ## 3
    ## one two , id(), ==, is 
    print(id(one))
    ## 29097904
    print(id(two))
    ## 29097904
    print(one == two)
    ## True
    print(one is two)
    

    7,__call__


    オブジェクトの後ろにかっこを付け、実行をトリガーします.注意:構築メソッドの実行は、オブジェクトの作成によってトリガーされます.すなわち、オブジェクト=クラス名()です.一方、callメソッドの実行は、オブジェクト()またはクラス()()()であるオブジェクトの後かっこでトリガーされます.
    class Foo:
    
        def __init__(self):
            pass
        
        def __call__(self, *args, **kwargs):
    
            print('__call__')
    
    
    obj = Foo() ##   __init__
    obj()       ##   __call__
    

    8,__len__

    class A:
        def __init__(self):
            self.a = 1
            self.b = 2
    
        def __len__(self):
            return len(self.__dict__)
    a = A()
    print(len(a))
    

    9,__hash__

    class A:
        def __init__(self):
            self.a = 1
            self.b = 2
    
        def __hash__(self):
            return hash(str(self.a)+str(self.b))
    a = A()
    print(hash(a))
    

    10,__eq__

    class A:
        def __init__(self):
            self.a = 1
            self.b = 2
    
        def __eq__(self,obj):
            if  self.a == obj.a and self.b == obj.b:
                return True
    a = A()
    b = A()
    print(a == b)
    

    トランプゲーム
    class FranchDeck:
        ranks = [str(n) for n in range(2,11)] + list('JQKA')
        suits = [' ',' ',' ',' ']
    
        def __init__(self):
            self._cards = [Card(rank,suit) for rank in FranchDeck.ranks
                                            for suit in FranchDeck.suits]
    
        def __len__(self):
            return len(self._cards)
    
        def __getitem__(self, item):
            return self._cards[item]
    
    deck = FranchDeck()
    print(deck[0])
    from random import choice
    print(choice(deck))
    print(choice(deck))
    

    カードゲーム2
    class FranchDeck:
        ranks = [str(n) for n in range(2,11)] + list('JQKA')
        suits = [' ',' ',' ',' ']
    
        def __init__(self):
            self._cards = [Card(rank,suit) for rank in FranchDeck.ranks
                                            for suit in FranchDeck.suits]
    
        def __len__(self):
            return len(self._cards)
    
        def __getitem__(self, item):
            return self._cards[item]
    
        def __setitem__(self, key, value):
            self._cards[key] = value
    
    deck = FranchDeck()
    print(deck[0])
    from random import choice
    print(choice(deck))
    print(choice(deck))
    
    from random import shuffle
    shuffle(deck)
    print(deck[:5])
    

    一つの面接問題
    class Person:
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
    
        def __hash__(self):
            return hash(self.name+self.sex)
    
        def __eq__(self, other):
            if self.name == other.name and self.sex == other.sex:return True
    
    
    p_lst = []
    for i in range(84):
        p_lst.append(Person('egon',i,'male'))
    
    print(p_lst)
    print(set(p_lst))