2.1.2 Python 객체에 대한 반사 및 내장 방법

9086 단어
클릭하여 노트 총목록을 이동합니다
목록 읽기
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클래스가 슈퍼클래스의 파생클래스인지 확인
    class Foo(object):
        pass
     
    class Bar(Foo):
        pass
     
    issubclass(Bar, Foo)
    

    2, 반사
    ==1 반사란 무엇인가==반사라는 개념은 1982년에 Smith가 처음으로 제기한 것으로 주로 프로그램이 그 자체의 상태나 행위를 방문, 검측, 수정할 수 있는 능력(자성)을 가리킨다.이 개념의 제기는 곧 컴퓨터 과학 분야의 응용 반사성에 대한 연구를 불러일으켰다.프로그램 언어의 디자인 분야에서 먼저 사용되었고Lisp와 대상을 대상으로 하는 분야에서 성과를 거두었다.2python은 대상에 대한 반사: = 문자열의 형식으로 대상과 관련된 속성을 조작합니다.python의 모든 사물은 대상(반사 사용 가능) 네 가지 자성할 수 있는 함수
    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
    

    네 가지 방법의 사용 시범
    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
    대상이 메모리에서 방출될 때 자동으로 실행됩니다.
    주: 이 방법은 일반적으로 정의할 필요가 없습니다. 파이톤은 고급 언어이기 때문에 프로그래머가 사용할 때 메모리의 분배와 방출에 관심을 가질 필요가 없습니다. 이 작업은 모두 파이톤 해석기에 맡기기 때문에 분석 함수의 호출은 해석기가 쓰레기 회수를 할 때 자동으로 터치하여 실행합니다. ==간단한 시범==
    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__
    대상 뒤에 괄호를 붙여서 실행을 촉발합니다.주: 구조 방법의 집행은 창설 대상에 의해 촉발된다. 즉, 대상 = 클래스 이름().콜 방법의 실행은 대상 뒤에 괄호를 붙여서 촉발한다. 즉, 대상 () 또는 클래스 () ()
    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))
    

    카드 게임
    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))
    

    좋은 웹페이지 즐겨찾기