美文网首页
Python基础语法 - 3 初识面向对象

Python基础语法 - 3 初识面向对象

作者: 左心Chris | 来源:发表于2019-10-15 12:42 被阅读0次

    1 类的属性,继承,多继承
    2 @property @x.setter @x.getter slots @staticmethod @classmethod
    3 装饰器 迭代器 生成器
    4 内置异常 try except finally raise

    1 初识面向对象

    封装,继承,多态

    2 类的特性

    2.1 类的属性和方法

    help(cls)
    dir(cls) type(cls) id(cls) str(cls)
    cls.__dict__
    初始化函数__init__(self): 析构函数__del__(self):
    __doc__,__module__, __class__, __bases__

    2.2 类的实现,实例和判定

    class Cat:
      def __init__(self):
        pass
      def show(self):
        print("I am a cat")
    if __name__ == "__main__":
      cat = Cat()
      cat.show()
      print(isinstance(cat, Cat))
    

    2.3 类的继承和多继承

    # 调用父类方法, Tiger为当前类
    super(Tiger, self).eat() 
    issubclass(DuanCat, BaseCat)
    
    class Panda(BaseCat, ProtectedInterface)
    issubclass(Panda, BaseCat)
    issubclass(Panda, ProtectedInterface)
    
    class C(B):
        def method(self, arg):
            super().method(arg)    # This does the same thing as:
                                   # super(C, self).method(arg)
    

    多继承初始化方案

    class A:
        def __init__(self):
            self.a = "A"
            print("I am A")
        
        def eat(self):
            print("I am eat A")
    
    class B:
        def __init__(self):
            self.b = "B"
            print("I am B")
        
        def beat(self):
            print("I am eating b")
    
    class C(A, B):
        def __init__(self):
            A.__init__(self)
            B.__init__(self)
            self.c = "C"
            print("I am C")
    
    if __name__ == "__main__":
        c = C()
        c.eat()
        print(c.__dict__)
        help(C)
    

    2.4 多态

    python基础就支持多态

    2.5 类的高级特性 property

    property将类的方法当属性使用

    class A:
      def __init__(self):
        self.__age = 100
      @property
      def show_info(self):
        return self.__age
    
    if __name__ == "__main__":
        a =A()
        print(c.show_info)
    

    @property, @x.getter, @x.setter
    https://www.python-course.eu/python3_properties.php

    2.6 类的高级特性 slots

    1 为指定的类设置一个静态属性空间
    2 为属性很少的类节约内存空间
    https://stackoverflow.com/questions/472000/usage-of-slots

    class A:
      __slot__ = ('a',)
    class B(A):
      __slot__ = ('b', 'c')
    

    2.7 类的事例方法和静态方法

    class A:
      def __init__(self, name):
        self.name = name
        print("Create A")
      @staticmethod
      def breath():
        print("I am A")
      @classmethod
      def show_info(cls, name):
        return cls(name)
      def show_info2(self):
        print(self.name)
    if __name__ == "__main__":
      c = A.show_info("A")
      c.show_info2()
    

    3 面向对象的应用和异常处理

    3.1 装饰器

    简单装饰器

    def log(func):
      def wrapper():
        print("start")
        func()
        print("stop")
      return wrapper
    
    @log
    def func():
      print("do something")
    

    带参数的装饰器

    def log(name=None):
      def decorator(func):
        def wrapper(*args, **kwargs)
          print("start")
          print(func(*args, **kwargs))
        return wrapper
      def return decorator
    
    @log('hello')
    def hello():
      print("hello world")
    
    @log('add')
    def add(a, b, *args, **kwargs):
      return a + b
    

    带参数的装饰器 带上__doc__和__name__等其他属性

    def log(name=None):
      @wraps(func)
      def decorator(func):
        def wrapper(*args, **kwargs)
          print("start")
          print(func(*args, **kwargs))
        return wrapper
      def return decorator
    

    类装饰器

    def f(self):
      print("hhh")
      print(self.name)
    def eat(cls):
      #cls.eat = lambda self: print(self.name)
      cls.eat = f
    
    @eat
    class A:
      def __init__(self):
        self.name = "A"
     if __name__ == '__main__':
        a = A()
        a.eat()
    

    3.2 迭代器

    实现了iter可以用for i in iterable: 比如list(iterable)
    实现了next可以用next(a) 或者 a.next()

    class PowNumber:
      value = 0
      def __next__(self):
        self.value += 1
        if self.value > 10:
          raise StopIteration
        return self.value ** 2
      def __iter__(self):
        return self
    if __name__ == "__main__":
      pow = PowNumber()
      print(pow.__next__())
      print(next(pow))
      for i in pow:
        print(i)
    

    3.3 生成器

    使用普通函数语法定义的迭代器,函数从yield处冻结返回,下次再从冻结处后面继续执行

    def pow():
      yield 1
      yield 2
    def pow2():
      return (x ** 2 for x in [1, 2, 3, 4])
    def pow3():
      for x in [1, 2, 3, 4]:
        yield x
    if __name__ == "__main__":
      for i in pow():
        print(i)
      for i in pow2():
        print(i)
      for i in pow3():
        print(i)
    

    3.4 异常处理

    内置异常

    Exception AttributeException OSError IndexError KeyError NameError SyntaxError TypeError ValueError ZeroDivisionError

    异常的捕获

    def do():
      pass
    if __name == '__main__':
      try:
        do()
      except (ZeroDivisionError, ValueError) as e:
        print(e)
      except Exception as e:
        pass
      finally:
        pass
    

    自定义异常

    class InvalidCtrlExeption(Exception):
      err_code = '1234'
      err_msg = 'get wrong'
      def __str__(self):
        print(self.err_msg)
    def do():
      try:
        raise InvalidCtrlException()
      except InvalidCtrlException as e:
        print(e)
    if __name__ == '__main__':
      do()
    

    异常的传递

    class MyException(Exception):
        pass
    
    def s1():
        raise MyException()
    
    def s2():
        try:
            s1()
            print("do")
        except MyException as e:
            raise e
        finally:
            print("s2f")
    
    def s3():
        try:
            s2()
        except MyException as e:
            print("processed")
        finally:
            print('s3')
            
    if __name__ == "__main__":
      s3()
    

    相关文章

      网友评论

          本文标题:Python基础语法 - 3 初识面向对象

          本文链接:https://www.haomeiwen.com/subject/ewsrmctx.html