python面向对象相关

面向对象

实现

  1. 定义类,在类中定义方法,在方法中去实现具体的功能。

  2. 实例化类并的个一个对象,通过对象去调用并执行方法。

  3. 注意:

    • 类名称首字母大写&驼峰式命名

    • .py3之后默认类都继承object

    • 在类中编写的函数称为方法

    • 每个方法的第一个参数是self

对象和self

  • __init__方法

每个类中都可以定义一个__init__初始化的方法,在类被实例化的时候自动执行次方法

在实例化类时,会将类后面的括号中的参数传给__init__

  • 对象:在类中封装一些数据,在需要使用的时候可以调用

  • self:对象当作参数传给self,在调用类中的方法可以获取对象的值

常见成员

  • 实例变量:属于对象,只通过对象调用

  • 类变量: 属于类。可以被所有的对象共用,类似全局变量

  • 绑定方法:属于类,类和对象都可以调用 默认有一个self参数

  • 类方法:属于类,类和对象都可以调用 默认有一个cls参数, @classmethod

  • 静态方法 属于类, 类和对象都可以调用,无默认参数,@staticmethod

类的方法都可以被对象和类调用;c#中绑定方法只能对象调用,类方法和静态方法只能类调用

分页实例

class Pagination:
     # __init__ 的参数是用户输入的页码,和默认的每页的元素为10
     def __init__(self, current_page, per_page_num=10):
         self.per_page_num = per_page_num
         # 判断输入的时否是整数 如果不是则将输入的值赋值1
         if not current_page.isdecimal():
             self.current_page = 1
             return
         current_page = int(current_page)
         # 判断输入的时否是小于1 如果不是则将输入的值赋值1
         if current_page < 1:
             self.current_page = 1
             return
         self.current_page = current_page
 ​
     def start(self):
         return (self.current_page - 1) * self.per_page_num
 ​
     def end(self):
         return self.current_page * self.per_page_num
 ​
 ​
 user_list = ["用户-{}".format(i) for i in range(1, 3000)]
 ​
 # 分页显示,每页显示10条
 while True:
     page = input("请输入页码:")
 ​
     # page,当前访问的页码
     # 10,每页显示10条数据
     # 内部执行Pagination类的init方法。
     pg_object = Pagination(page, 20)
     page_data_list = user_list[pg_object.start(): pg_object.end()]
     for item in page_data_list:
         print(item)
 ​
  • 属性 由绑定方法 + 特殊装饰器 组合创造出来的,让我们以后在调用方法时可以不加括号 @property

    关于属性的编写有两种方式:

    • 方式一,基于装饰器

      class C(object):
           
           @property
           def x(self):
               pass
           
           @x.setter
           def x(self, value):
               pass
           
           @x.deleter
           def x(self):
               pass
               
       obj = C()
       ​
       obj.x
       obj.x = 123
       del obj.x
    • 方式二,基于定义变量

      class C(object):
           
           def getx(self): 
               pass
           
           def setx(self, value): 
               pass
               
           def delx(self): 
               pass
               
           x = property(getx, setx, delx, "I'm the 'x' property.")
           
       obj = C()
       ​
       obj.x
       obj.x = 123
       del obj.x

属性名称 不要 与实例变量 重名

三大特性

封装

  • 将同类数据放在同一个类中

  • 可以封装在__init__中,类中的方法可以使用

继承

子类可以使用父类中的方法和类变量

继承方式:class Son(father)

class Base:
 ​
     def func(self):
         print("Base.func")
 ​
 class Son(Base):
     
     def show(self):
         print("Son.show")
         
 s1 = Son()
 s1.show()
 s1.func() # 优先在自己的类中找,自己没有才去父类。
 ​
 s2 = Base()
 s2.func()

执行方法时,首先在对象关联的类中找方法,子类没有才去父类中查找

多继承时,先左后右

self对应的是谁,先去self对于的类中去找成员,再去父类中找

多态

鸭子类型(duck typing)

多种形态: 如下可以传入不同类型的参数

def func(arg):
     v1 = arg.copy() # 浅拷贝
     print(v1)
     
 func("武沛齐")
 func([11,22,33,44])

数据类型

# 实例化一个str类的对象v1
 v1 = str("武沛齐") 
 ​
 # 通过对象执行str类中的upper方法。
 data = v1.upper()
 ​
 print(data)

变量在转换和声明时就是实例化了一个对象,然后调用类中的方法

成员修饰符

  • 公有:在任何地方都可以调用这个成员。

  • 私有:只有在类的内部才可以调用改成员(成员是以两个下划线开头,则表示该成员为私有)。

  • 父类中的私有成员,子类无法继承。

 

对象嵌套

 

 

 

 

特殊成员

  • __init__ 初始化方法

  • __new__ 构造方法

  • __call__ 执行方法

  • __str__ 返回字符串

  • __dict__ 构建字典的方法

  • __getitem____setitem____delitem__ 字典的取值和设置值 删除值的方法

  • __enter____exit__ 上下文管理

  • __add__

  • __iter__ 迭代器方法

    1.当类中定义了 __iter__ 和 __next__ 两个方法。
     2.__iter__ 方法需要返回对象本身,即:self
     3. __next__ 方法,返回下一个数据,如果没有数据了,则需要抛出一个StopIteration的异常。

内置函数

  • callable,是否可在后面加括号执行。

    变量名加()可以是函数,类,具有call方法的对象

  • super,按照mro继承关系向上找成员。

    当原来的类中需要增加功能又不改变原来类的时候可以在子类中用super().父类中的方法调用父类的方法

  • type,获取一个对象的类型。

  • isinstance,判断对象是否是某个类或其子类的实例。

  • issubclass,判断类是否是某个类的子孙类。

异常处理

  • 异常基本格式

try:
     # 逻辑代码
 except Exception as e:
     # try中的代码如果有异常,则此代码块中的代码会执行。
 finally:
     # try中的代码无论是否报错,finally中的代码都会执行,一般用于释放资源。
     
     
 """
 try:
     file_object = open("xxx.log")
     # ...
 except Exception as e:
     # 异常处理
 finally:
     file_object.close()  # try中没异常,最后执行finally关闭文件;try有异常,执行except中的逻辑,最后再执行finally关闭文件。
 """
  • 常见异常

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
 IOError 输入/输出异常;基本上是无法打开文件
 ImportError 无法引入模块或包;基本上是路径问题或名称错误
 IndentationError 语法错误(的子类) ;代码没有正确对齐
 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
 KeyError 试图访问字典里不存在的键
 KeyboardInterrupt Ctrl+C被按下
 NameError 使用一个还未被赋予对象的变量
 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
 TypeError 传入对象类型与要求的不符合
 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
 导致你以为正在访问它
 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
  • 自定义异常&抛出异常

    使用:raise MyException()类实现触发自定义的异常

    class MyException(Exception):
         pass
     ​
     ​
     try:
         raise MyException()
     except MyException as e:
         print("MyException异常被触发了", e)
     except Exception as e:
         print("Exception", e)
  • 特殊的finally

    在try或except中即使定义了return,也会执行最后的finally块中的代码。

    def func():
         try:
             return 123
         except Exception as e:
             pass
         finally:
             print(666)
             
     func()

 

posted @ 2021-08-25 23:10  wq512  阅读(35)  评论(0编辑  收藏  举报