首页 > 编程语言 >python必坑知识点(面向对象)

python必坑知识点(面向对象)

时间:2023-08-23 15:14:06浏览次数:47  
标签:__ 知识点 调用 迭代 python 方法 self 对象 必坑

面向对象的三大特性:封装,继承,多态

1 三大特性

1.1 封装

将数据或方法放到类里,以供外部调用或自己隐藏

# 封装原则
1、高内聚:高内聚是指一个模块中各个部分之间关联应该是紧密的。
2、低耦合:低耦合是指多个模块之间的关联应该是松散的。

1.2 继承

将类中的公共的方法提取到基类中去实现。
将子类的数据封装到父类中,供子类使用,将多个子类的方法封装到同一类型中

- 执行对象.方法时,优先去当前对象所关联的类中找,没有的话才去她的父类中查找。(要时刻记住当前self是谁)
- Python支持多继承:先继承左边、再继承右边的。

1.3 多态

本身具有多态,提倡鸭子类型,不在乎传入的参数是什么类型,只要有对应的方法即可

1.4 面向对象的应用场景

1. 数据封装。
2. 封装数据 + 方法再对数据进行加工处理。
3. 创建同一类的数据且同类数据可以具有相同的功能(方法)。

1.5 经典类和新式类

py2中分为经典类(不继承Object)和新式类(继承Object)
py3中都是新式类(默认都会继承Object)

1.6 type类型

def run():
    print(type(object))
    print(type(type))
    ...


if __name__ == '__main__':
    run()
"""
<class 'type'>
<class 'type'>
"""

2 成员

  • 变量
    • 实例变量(对象自己的数据)
    • 类变量(类的变量,对象共享,类似于全局变量)
  • 方法
    • 绑定方法(默认有一个self参数,self就等于调用方法的这个对象)
    • 类方法@classmethod(默认有一个cls参数,cls就等于调用方法的这个类)
    • 静态方法@staticmethod (无默认参数)
  • 属性
    • @property(在调用时不用加括号)

在Python中比较灵活,方法都可以通过对象和类进行调用;而在javac#等语言中,绑定方法只能由对象调用;类方法或静态方法只能由类调用。

2.1 面试题

# 在类中 @classmethod 和 @staticmethod 的作用?

两者都可以直接类名.方法()来调用,不需要实例化,并且两者都不需要传入self参数
@classmethod修饰类方法,第一个参数为cls,表示当前调用的类的本身
@staticmethod修饰静态方法,默认无参数,就像普通的函数一样

2.2 编写类方法方式

注意:由于属性和实例变量的调用方式相同,所以在编写时需要注意:属性名称 不要和 实例变量 重名。

  • 方式一,基于装饰器
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

2.3 成员修饰符

Python中成员的修饰符就是指的是:公有、私有

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

私有成员可以被调用,但不推荐。对象._类名.__私有

2.4 特殊成员

__init__	初始化方法
__new__		构造一个对象,在初始化对象之前触发
__new__在__init__前触发

__call__	对象被调用时触发
__str__		print输出时触发
__dict__ 	可将参数打包成字典

__getitem__,__setitem__,__delitem__
obj["x1"]
obj['x2'] = 123
del obj['x3']

__enter__,__exit__		上下文管理
__enter__  return一个self

__add__,__mul__,等
obj1+obj2  # 对象+值,内部会去执行 对象.__add__方法,并将+后面的值当做参数传递过去。

__iter__
迭代器
# 迭代器类型的定义:
    1.当类中定义了 __iter__ 和 __next__ 两个方法。
    2.__iter__ 方法需要返回对象本身,即:self
    3. __next__ 方法,返回下一个数据,如果没有数据了,则需要抛出一个StopIteration的异常。
	官方文档:https://docs.python.org/3/library/stdtypes.html#iterator-types
生成器
	# 创建生成器对象(内部是根据生成器类generator创建的对象),生成器类的内部也声明了:__iter__、__next__ 方法。
可迭代对象
	# 如果一个类中有__iter__方法且返回一个迭代器对象 ;则我们称以这个类创建的对象为可迭代对象。
	# 可迭代对象是可以使用for来进行循环,在循环的内部其实是先执行 __iter__ 方法,获取其迭代器对象,然后再在内部执行这个迭代器对象的next功能,逐步取值。

2.5 作业题

简述面向对象的成员和其特点

"""
- 变量
    - 实例变量,属于对象。每个对象中中都封装各自的值。只能通过的对象来进行调用。
    - 类变量,属于类。每个类中各自保存的数据。可以通过对象和类来进行读取。
- 方法
    - 绑定方法,默认有一个self参数,由对象进行调用(此时self就等于调用方法的这个对象)【对象&类均可调用】
    - 类方法,默认有一个cls参数,用类或对象都可以调用(此时cls就等于调用方法的这个类)【对象&类均可调用】
    - 静态方法,无默认参数,用类和对象都可以调用。【对象&类均可调用】
- 属性
    基于方法+property装饰器实现可以实现,可以实现
        obj.属性名
        obj.属性名 = 123
        del obj.属性名
    语法和方法的对应关系。
"""

@staticmethod@classmethod的作用是什么

"""
两者都不需要传入self参数,都不用通过实例化去调用方法(类名.方法())

@classmethod
    修饰类方法,第一个参数为cls,值为当前调用的对象本身
@staticmethod
    修饰静态方法,可以没有参数,相当于在类中定义一个普通的函数

"""

简述你理解的:迭代器、生成器、可迭代对象。

"""
迭代器
    拥有__iter__,__next__方法,
    并且__iter__返回迭代器对象本身,即self,__next__返回下一个数据,如果没有了,要抛出StopIteration异常
生成器
    同样拥有__iter__,__next__方法,生成器类时一种特殊的迭代器类
可迭代对象
    拥有__iter__方法,并且该方法返回一个迭代器对象,
    可迭代对象可通过for循环取值,在循环内部先执行__iter__方法,取出其迭代器对象,再通过next功能逐步取值
"""

3 继承补充

3.1 补充

特别补充:一句话搞定继承关系

从左到右,深度优先,大小钻石,留住顶端

image-20221022205053141

简写为:A -> B -> D -> G -> H -> K -> C -> E -> F -> M -> N -> P -> object

3.2 py2py3区别

在python2.2之前,只支持经典类【从左到右,深度优先,大小钻石,不留顶端】
在python2.2之后就出现了经典类和新式类共存。(正式支持是2.3)
在python3中丢弃经典类,只保留新式类【从左到右,深度优先,大小钻石,保留顶端 -- C3算法】

3.3 isinstanceandissubclass

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

3.4 super

根据mro向上查找父类,在重写父类方法的时候保留原有的功能

# super的作用
根据类的继承关系向上查找成员
在重写父类的方法时保留父类方法的

4 异常处理

4.1 常见异常

常见异常:
"""
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问n x[5]
KeyError 试图访问字典里不存在的键 inf['xx']
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
"""
更多异常:
"""
ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError
"""

4.2 特殊的finally

当在函数或方法中定义异常处理的代码时,要特别注意finally和return。
"""在try或except中即使定义了return,也会执行最后的finally块中的代码。"""

5 反射

5.1 基本

Python中提供了4个内置函数来支持反射:

  • getattr,去对象中获取成员

    v1 = getattr(对象,"成员名称")
    v2 = getattr(对象,"成员名称", 不存在时的默认值)
    
  • setattr,去对象中设置成员

    setattr(对象,"成员名称",值)
    
  • hasattr,对象中是否包含成员

    v1 = hasattr(对象,"成员名称") # True/False
    
  • delattr,删除对象中的成员

    delattr(对象,"成员名称")
    

以后如果再遇到 对象.成员 或 xx.oo 这种编写方式时,均可以基于反射来实现。

5.2 import_module + 反射

from importlib import import_module

path = "openpyxl.utils.exceptions.InvalidFileException"

module_path, class_name = path.rsplit(".",maxsplit=1) # "openpyxl.utils.exceptions"   "InvalidFileException"

module_object = import_module(module_path)

cls = getattr(module_object, class_name)

print(cls)

5.3 反射的作用

以字符串的形式灵活的操作类中的成员

标签:__,知识点,调用,迭代,python,方法,self,对象,必坑
From: https://www.cnblogs.com/z-h-q/p/17651661.html

相关文章

  • python面试题01
    基础题写一个带参数的闭包fromfunctoolsimportwrapsdefouter(n):@wraps(n)defwrapper(func):definner(*args,**kwargs):print("inner")print(n)returnfunc(*args,**kwargs)returninner......
  • Python列表推导式
    int_list=range(1,55,2)print(list(int_list))结果:[1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53]int_list=range(1,55,2)print([str(x)forxinint_list])结果:['1','3',&......
  • 【腾讯云 TDSQL-C Serverless 产品体验】 使用 Python 向 TDSQL-C 添加读取数据 实现
    前言TDSQL-CMySQL版(TDSQL-CforMySQL)是腾讯云自研的新一代云原生关系型数据库。融合了传统数据库、云计算与新硬件技术的优势,为用户提供具备高弹性、高性能、海量存储、安全可靠的数据库服务。TDSQL-CMySQL版100%兼容MySQL5.7、8.0。实现超百万级QPS的高吞吐,最高PB级智......
  • 真香!基于 Prometheus 的持久化存储,全是知识点
    Prometheus将基于告警规则生成的告警存储为时间序列,不会将Alertmanager的告警信息持久化存储,那么针对历史告警的检索、统计等需求就无法实现。因此需要一种持久化机制用于存储历史告警信息,本文主要探究基于alertmanager告警的开源持久化方案。1.告警触发机制基于主机层面内存......
  • python必坑知识点05
    1、js基本数据类型undefined,null,number,string,symbol,boolean,object,array,date2、js中的拷贝(深浅拷贝)https://www.cnblogs.com/echolun/p/7889848.htmlhttps://www.bilibili.com/video/BV1iu411e7DS/?spm_id_from=333.337.search-card.all.click&vd_source=69181b959bc0......
  • Python基础入门学习笔记 077 GUI的终极选择:Tkinter14
    Tkinter提供了三种标准对话框模块,分别是:messagebox、filedialog、colorchoosermessagebox(消息对话框)实例1:askokcancel函数1fromtkinterimport*23print(messagebox.askokcancel("FishCDemo","发射核弹?"))45mainloop() 实例2:askquestion函数 实例3:asire......
  • Python基础入门学习笔记 074 GUI的终极选择:Tkinter11
    事件绑定对于每个组件来说,可以通过bind()方法将函数或方法绑定到具体的事件上。当被触发的事件满足该组件绑定的事件时,Tkinter就会带着事件描述去调用handler()方法实例1:捕获单击鼠标位置1fromtkinterimport*23root=Tk()45defcallback(event):6prin......
  • Python基础入门学习笔记 075 GUI的终极选择:Tkinter12
    Message组件Message(消息)组件是Label组件的变体,用于显示多行文本信息。Message组件能够自动换行,并调整文本的尺寸使其适应给定得尺寸。实例1:1fromtkinterimport*23root=Tk()4w1=Message(root,text="这是一则消息",width=100)5w1.pack()6w2=Message(root,......
  • Python基础入门学习笔记 071 GUI的终极选择:Tkinter8
    Canvas(画布)组件一个可以让你随心所欲绘制界面的组件。通常用于显示和编辑图形,可以用它来绘制直线、图形、多边形,甚至是绘制其他组件。实例1:1fromtkinterimport*2root=Tk()3#创建canvas对象框,设置其宽度、高度与背景色4w=Canvas(root,width=200,height=100,b......
  • Python基础入门学习笔记 073 GUI的终极选择:Tkinter10
    Munu组件Tkinter提供了一个Menu组件,用于实现顶级菜单、下拉菜单和弹出菜单。实例1:创建一个顶级菜单(或称窗口主菜单)1fromtkinterimport*23defcallback():4print("被调用了")56root=Tk()789menubar=Menu(root)#创建一个顶级菜单10m......