8.Python-----进阶篇(面向对象高级特性及魔术方法-知识)

一、面向对象的高级特性

1.类属性与实例属性

  • 类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本。
  • 实例属性(对象属性),它不被所有类对象的实例对象所共有,在内存中的副本个数取决于对象个数。

2.类方法与静态方法

  • 类方法是类对象所拥有的方法,需要用修饰器一般以@classmethod来标识其为类方法,
    1). 对于类方法,第一个参数必须是类对象,作为第一个参数
    (cls是形参, 可以修改为其它变量名,但最好用’cls’了)
    2). 能够通过实例对象和类对象去访问。
  • 静态方法需要用修饰器一般以@staticmethod来标识其为静态方法,
    1). 静态方法不需要多定义参数
    2). 能够通过实例对象和类对象去访问。

3.property类属性

  • 一种用起来像是使用的实例属性一样的特殊属性,可以对应于类的某个方法。
  • property属性的定义和调用要注意一下几点:
    定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个self参数
    调用时,无需括号
  • 类属性应用需求: 对于京东商城中显示电脑主机的列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第m条到第n条的所有数据 这个分页的功能包括:
    • 根据用户请求的当前页和总数据条数计算出 m 和 n。
    • 根据m 和 n 去数据库中请求数据。
  • property属性的有两种方式:
    • 装饰器 即:在方法上应用装饰器。
    • 类属性 即:在类中定义值为property对象的类属性。
  • 注意:
    • 经典类中的属性只有一种访问方式,其对应被 @property 修饰的方法。
    • 新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法。

4.单例模式

  • 对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。

二、魔术方法

1.特殊属性

魔术方法名称		功能
__name__    	类、函数、方法等的名字
__module__ 		类定义所在的模块
__class__ 		对象或类所属的类
__bases__ 		当前类的基类(父类)
__doc__   		类、函数的文档帮助,没有定义为None
__mro__    		Method Resolution Order 方法解析顺序 
__dict__   		类或实例的属性,可写的字典

查看属性

__dir__     返回类或者对象的所有成员名称列表。dir() 函数就是调用__dir__()。
1). 如果dir([obj])  参数obj包含方法 __dir__(),该方法将被调用。
2). 如果Obj 不包含 __dir__(),该方法将最大限度收集属性信息

2.创建,初始化与销毁

  • 面试常问: python 中__new__ , init , __call__的区别?
    1). new的功能是在生成对象之前执行的内容,接受的参数是cls 类, 负责对象的创建。
    2). init的功能是在对象生成之后执行的内容, 接受的参数是self 对象, 负责对象的初始化。
    3). call的功能是在调用对象时执行的内容, 可以模拟函数的行为。

  • 当我们新建一个对象 x=someclass() 的时候,经历的步骤:

1). 第一: __new__先创建类并返回类的实例。
2). 第二: 自动调用__init__来初始化函数的值。
3). 汇总: 第一步和第二步共同构成了【构造函数】。
4). 第三步: 对象生命周期调用结束时,__del__ 方法(构析函数)会被调用。

3.可视化

  • 类型判断要使用type或isinstance, 不能通过判断print输出是否带引号来判断输出值的类型。
1). str()与repr()都是python中的内置函数,是直接用来格式化字符串的函数。
2). 当使用内置函数str(obj)时, 自动执行obj.__str__()魔术方法。
3). 当使用内置函数repr(obj)时, 自动执行obj.__repr__()魔术方法。
4). 当__str__魔术方法不存在时, 自动执行__repr__()魔术方法的内容。

4.with语句安全上下文

  • with语句操作的对象必须是上下文管理器。那么,到底什么是上下文管理器呢?
1). 简单的理解,拥有 __enter__() 和 __exit__() 方法的对象就是上下文管理器。
__enter__(self):进入上下文管理器自动调用的方法,在 with 执行之前执行。如果 有 as子句,该方法的返回值被赋值给 as 子句后的变量;该方法可以返回多个值。
__exit__(self, exc_type, exc_value, exc_traceback):退出上下文管理器自动调用的方法。在 with 执行之后执行(不管有无异常)。
2).  当 with as 操作上下文管理器时,就会在执行语句体之前,先执行上下文管理器的 __enter__() 方法,然后再执行语句体,最后执行 __exit__() 方法。

  • 构建上下文管理器,常见的有 2 种方式:基于类实现和基于生成器实现。
    方法一: 装饰器 contextlib.contextmanager,来定义自己所需的基于生成器的上下文管理器。

方法二: 基于类的上下文管理器: 只要一个类实现了 enter() 和 exit() 这 2 个方法,程序就可以使用 with as 语句来管理它。

class Myopen(object):
	def _init_(self,name,mode='r'):
			self.name = name 
			self.mode = mode
	def _enter_(self):
			#当with语句进入并开始执行时,执行的内容。
			#需要返回一个对象,在执行结束之后用来关闭或者其他操作。
			self.f = open(self.name, self.mode)
			print("正在打开文件%s....."%(self.name))
			return self.f
	def _exit_(self, exc_type, exc_val, exc_tb);
			#当with语句执行结束后,坐什么操作。
			self.f.f.close()
			print("文件正在关闭...........")

5.索引与切片

  • 索引&切片魔术方法:
__setitem__:当属性被以索引、切片方式赋值的时候会调用该方法
__getitem__:一般如果想使用索引、切片访问元素时,就可以在类中定义这个方法
__delitem__:当使用索引、切片删除属性时调用该方法

6.魔术方法汇总

基本的魔法方法
有关属性的魔术方法
比较操作符
算数运算符
反运算
增量赋值运算
一元操作符
类型转换
上下文管理(with 语句)
容器类型

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值