파이썬 반사 및 내장 방법 (방법 더블)

파이썬 반사 및 내장 방법 (방법 더블)

반사

  1. 반사 란 무엇인가

    개념은 프로그램이 자신의 상태 나 행동 (반성)을 감지하고 수정할 수있는 기능에 액세스 할 수 있습니다에 주로 의미 먼저 제안 된 1982 년에 스미스 반영됩니다. 그것은 신속하게 반사 컴퓨터 과학의 응용 프로그램에 대한 연구를 주도 개념을 앞으로 넣습니다. 먼저 프로그래밍 언어 설계 분야에서 사용하고, 리스프 객체 지향 측면에서 성과를 만들었다.

  2. 파이썬 반사 객체 지향

    문자열에서 운영하는 객체와 관련된 속성. 모든 파이썬의 객체 (당신이 반사를 사용할 수 있습니다)입니다

    네 가지 기능은 자체 검사를 달성 할 수있다 :

    1. 으로 hasattr ()를 포함하는 속성인지 여부를 검출

      class Foo:
          def __init__(self, name, age):
              self.name = name
              self.age = age
      
          def func(self):
              pass
      
      # 检测是否含有某属性
      print(hasattr(Foo, "func"))       # True
      f = Foo("dogfa", 18)
      print(hasattr(f, "name"))     # True
      print(hasattr(f, "gender"))       # False
    2. getattr은 () : 속성을 가져옵니다

      class Foo:
          def __init__(self, name, age):
              self.name = name
              self.age = age
      
          def func(self):
              pass
      
          @staticmethod
          def staticfunc():
              print("嘿嘿嘿")
      
      # 获取属性
      f = getattr(Foo, "staticfunc")
      print(f)  # <function Foo.staticfunc at 0x0000028DD8EB9D08>
      f()           # 嘿嘿嘿
      
      # 如果要获取的属性不存在那么就会报错
      f2 = getattr(Foo, "func1")    # AttributeError: type object 'Foo' has no attribute 'func1'
    3. 않은 setattr () : 속성 설정

      class Foo:
          def __init__(self, name, age):
              self.name = name
              self.age = age
      
          def func(self):
              pass
      
          @staticmethod
          def staticfunc():
              print("嘿嘿嘿")
      
      
      f = Foo("dogfa", 18)
      print(f.__dict__)     # {'name': 'dogfa', 'age': 18}
      setattr(f, "name", f.name + "sb")
      print(f.__dict__)     # {'name': 'dogfa_sb', 'age': 18}
    4. defattr () : 속성을 삭제

      class Foo:
          def __init__(self, name, age):
              self.name = name
              self.age = age
      
          def func(self):
              pass
      
          @staticmethod
          def staticfunc():
              print("嘿嘿嘿")
      
      f = Foo("dogfa", 18)
      print(f.__dict__)     # {'name': 'dogfa', 'age': 18}
      delattr(f, "name")
      print(f.__dict__)     # {'age': 18}
      
      # delattr(f, "gender")    # 删除不存在的属性时会报错
  3. 반사 장면을 사용하여

    1. 물체의 반사
    2. 클래스의 반사
    3. 다른 모듈을 반영
    4. 반사 현재 모듈

둘째, 내장 방법

  1. 차 함수 및 방법

    우리는 먼저 파이썬 방법은 말했다 이전에 함수와 방법의 차이를 찾습니다.

    # 通过导入types模块来验证
    from types import FunctionType, MethodType
    
    def func():
        pass
    
    class A:
        def func(self):
            pass
    
        @staticmethod
        def func2():
            pass
    
    obj = A()
    
    # FunctionType:函数    MethodType:方法
    print(isinstance(func, FunctionType))        # True
    print(isinstance(A.func, FunctionType))      # True
    print(isinstance(obj.func, FunctionType))    # False
    print(isinstance(obj.func, MethodType))      # True
    print(isinstance(A.func2, FunctionType)) # True
    print(isinstance(obj.func2, FunctionType))   # True
    
    
    
    # 通过打印函数(方法)名验证
    from types import FunctionType, MethodType
    def func():
        pass
    
    class A:
        def func(self):
            pass
    
        @staticmethod
        def func2():
            pass
    
    obj = A()
    
    print(func)      # <function func at 0x000002013BC32E18>
    print(A.func)    # <function A.func at 0x000002013BF6A598>
    print(obj.func)  # <bound method A.func of <__main__.A object at 0x000002013BDF7DD8>>

    요약 :

    (1) 함수가 명시 적으로 데이터를 전달한다. 우리가 어떤 데이터를 전달 LEN () 함수로 표시 할 경우를 처리한다.

    (2) 함수는 객체와는 아무 상관이있다.

    데이터 (3) 방법은 암시 적으로 전송된다.

    내부 클래스의 조작 데이터 (4)하는 방법.

    (5) 방법은 객체와 연관된다. 우리가 () 메소드는 객체의 str을 통해 호출 제거 ​​할 때와 마찬가지로, 우리는 다음 s.strip ()를 호출, 같은 문자열의가 있습니다. 예, 스트립 () 메소드는 객체 STR에 속한다.

    (6) 고정 방법은 함수이다

  2. 내장 방법 (방법 더블)

    정의 : 더블 다운은 특별한 방법으로는, 그의 방법은 메소드 이름에서 제공하는 특별한 의미 인터프리터 플러스 멋진 두 번 밑줄 이름 __ __ 방법을 강조, 방법은 우리가 주로 두 아래 소스 파이썬 프로그래머입니다 개발 방법을 두 배로하려고하지 말고 우리에게 더 이익이 두 배 더 연구 방법은, 소스 코드를 읽을 수 있습니다.

    전화 : 다른 트리거 모드가 무덤이, 무의식적으로 트리거 될 때 트리거 같은 기관처럼, 다른 방법에서 두 번 두 아래 방법, 예를 들어 : __ init__

    1. 항목 시리즈

      class Foo:
          def __init__(self, name, age):
              self.name = name
              self.age = age
      
          def __getitem__(self, item):
              print("执行obj['key']时会执行我")
              return getattr(self, item)
      
          def __setitem__(self, key, value):
              print("执行obj['key'] = value 时会执行我")
              setattr(self, key, value)
      
          def __delitem__(self, key):
              print("执行del['key']时会执行我")
              delattr(self,  key)
      
      obj = Foo("oldwang", 20)
      print(obj["name"])
      # 执行obj['key']时会执行我
      # oldwang
      
      obj["name"] = "oldniu"
      print(obj["name"])
      # 执行obj['key'] = value 时会执行我
      # 执行obj['key']时会执行我
      # oldniu
      
      print(obj.__dict__)
      del obj["name"]
      print(obj.__dict__)
      # {'name': 'oldniu', 'age': 20}
      # 执行del['key']时会执行我
      # {'age': 20}
    2. __del__

      객체가 상기 메모리에 놓을 때 소멸자, 자동 실행을 트리거링.

      파이썬은 높은 수준의 언어이기 때문에이 작업이 실행 파이썬 인터프리터에 있기 때문에 걱정없이 사용하는 프로그래머는 메모리를 할당하고 해제,이 방법은 일반적으로 정의 할 필요가 없기 때문에 소멸자가 호출 참고 자동 통역으로 시간 가비지 컬렉터에서 수행 트리거 방식.

      class FileHandle:
          def __init__(self, file_path):
              self.f = open(file_path, mode="r", encoding="utf-8")
      
          def read(self):
              return self.f.read(1024)
      
          def __del__(self):
              # 在程序执行完时释放文件句柄
              self.f.close()
      
      f = FileHandle("file/userinfo")
      print(f.read())
    3. __새로운__

      # 单例类
      class Single:
          __isinstance = None
      
          def __new__(cls, *args, **kwargs):
              if not cls.__isinstance:
                  cls.__isinstance = object.__new__(cls)
                  return cls.__isinstance
              return cls.__isinstance
      
      one = Single()
      two = Single()
      print(one is two) # True
    4. __요구__

      개체 뒤에 괄호, 실행을 트리거합니다.

      주 : 생성자 즉 생성 트리거 오브젝트에 의해 실행된다) 클래스 이름 = 객체 (들면 통화 대상의 방법에 의해 수행이 즉 브래킷 트리거 : 개체 () 또는 클래스 ()

      class Foo:
          def __call__(self, *args, **kwargs):
              print("执行__call__")
      
      f = Foo()
      f()           # 执行__call__
      
      # 还可以这样写
      Foo()()
    5. __len__

      class Foo:
          def __init__(self, name, age):
              self.name = name
              self.age =age
      
          def __len__(self):
              return len(self.__dict__)
      
      f = Foo("dogfa", 18)
      print(len(f)) # 2
    6. __해시시__

      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))
    7. __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) # True

셋째, 다른

# 有一个员工类,1000个员工对象,对象属性有姓名,性别,年龄,部门,
# 按姓名,性别对1000个对象去重
class Employee:
    def __init__(self, name, age, gender, department):
        self.name = name
        self.age = age
        self.gender = gender
        self.department = department
        
    def __hash__(self):
        return hash("{0}{1}".format(self.name, self.gender))
        
    def __eq__(self, other):
        if self.name == other.name and self.gender == other.gender:
            return True
            
employee_list = []

for i in range(250):
    employee_list.append(Employee("dogfa", i, "male", "python" + str(i)))
    
for i in range(250):
    employee_list.append(Employee("djb", i, "female", "php" + str(i)))
    
for i in range(250):
    employee_list.append(Employee("oldniu", i, "male", "java" + str(i)))
    
for i in range(250):
    employee_list.append(Employee("cdj", i, "female", "go" + str(i)))
    
for employee_obj in set(employee_list):
    print(employee_obj.__dict__)

추천

출처www.cnblogs.com/wangyueping/p/11111899.html