博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python面向对象的高级特性
阅读量:4159 次
发布时间:2019-05-26

本文共 4017 字,大约阅读时间需要 13 分钟。

一、类方法与静态方法

类方法是类对象所拥有的方法,需要用修饰器一般以@classmethod来标识其为类方法,

1). 对于类方法,第一个参数必须是类对象,作为第一个参数
(cls是形参, 可以修改为其它变量名,但最好用’cls’了)
2). 能够通过实例对象和类对象去访问。

"""相关的源码:from datetime import  datetime"""class Student(object):    def __init__(self, name, age):        self.name = name        self.age = age    # 实例方法, python解释器会自动将对象/实例传入方法。    def get_age(self):        print('self:', self)        return  self.age    # 类方法:python解释器会自动将类传入方法。    @classmethod    def get_cls(cls):        print('cls:', cls)    # 静态方法:python解释器不会自动传入任何参数    @staticmethod    def get_info():        print("static method信息")if __name__ == '__main__':    s = Student('张三', 18)    s.get_age()    s.get_cls()    s.get_info()

代码运行结果:

在这里插入图片描述

二、property类属性

一种用起来像是使用的实例属性一样的特殊属性,可以对应于类的某个方法。

property属性的定义和调用要注意一下几点:
1.定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个self参数
2.调用时,无需括号

类属性应用需求: 对于京东商城中显示电脑主机的列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第m条到第n条的所有数据 这个分页的功能包括:

  • 根据用户请求的当前页和总数据条数计算出 m 和 n
  • 根据m 和 n 去数据库中请求数据
"""类属性应用需求: 对于京东商城中显示电脑主机的列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第m条到第n条的所有数据 这个分页的功能包括:- 根据用户请求的当前页和总数据条数计算出 m 和 n- 根据m 和 n 去数据库中请求数据from datetime import  datetime"""class Page(object):    """    [user1, user2, user3......user100]    page=2, per_page=10    第一页: start=0 end=10    第二页: start=10 end=20    第三页: start=20 end=30    ....    第page页: start=(page-1)*per_page end=page*per_page    """    def __init__(self, page, per_page=10):        self.page = page        self.per_page = per_page    # 类属性: 将类方法变成类属性的过程。    @property    def start(self):        return (self.page-1) * self.per_page    @property    def end(self):        return  self.page * self.per_pageif __name__ == '__main__':    goods = ['good'+str(i+1) for i in range(100)]    page = Page(page=10, per_page=3)    print(goods[page.start:page.end])

在这里插入图片描述

简单实例:

class date(object):    def __init__(self,year,month,day):        #私有属性        self.__year = year        self.__month = month        self.__day = day    # 将类方法object.year()转变成类属性object.year,只是为了代码简洁    @property    def year(self):        return self.__yeartoday = date(2021,3,6)print(today.year)  #2021

三、单例模式

在这里插入图片描述

为什么使用单例模式?

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

class People(object):    passp1 = People()  #objectp2 = People()  #objectprint(p1,p2)   #每个对象的内存地址不同,所以肯定不是单例模式

实现方法

装饰器实现

装饰器(decorator)可以动态地修改一个类或函数的功能。这里,我们也可以使用装饰器来

装饰某个类,使其只能生成一个实例,代码如下

from functools import  wrapsdef singleton(cls):    #通过一个字典存储类和对象信息{"Class":"object"}    instances = {
} @wraps(cls) def wrapper(*args,**kwargs): #为了保证单例模式,判断该类是否已经实例化为对象 # 1.如果有对象,直接返回存在的对象 # 2.如果没有则实例化对象,并存储类和对象到字典中,最后返回对象 if instances.get(cls): return instances.get(cls) object = cls(*args,**kwargs) instances[cls] = object return object return wrapper@singletonclass People(object): passp1 = People()p2 = People()print(p1,p2)print(p1 is p2) #判断是否为单例模式,对比p1和p2的内存地址是否相同

在这里插入图片描述

new方式实现

class People(object):    _instance = None    def __new__(cls, *args, **kwargs):        """创建对象之前执行的内容"""        if cls._instance is None:            cls._instance = object.__new__(cls)        return  cls._instance    def __init__(self):        """在new方法之后执行, 将属性和对象封装在一起"""        print("正在执行构造方法init......")p1 = People()p2 = People()print(p1, p2)

在这里插入图片描述

总结:

"""面向对象:    1. 三大特性        封装(必须要掌握的):            __new__: 在实例化对象之前执行的, 返回对象。            __init__: 构造方法, 实例化对象时自动执行。 常用于将对象和属性绑定在一起。            self: 实质上是对象。        继承(最多知识点的):            多继承算法: python3中广度优先算法。            私有属性和私有方法        多态(最简单的):    2. 三大特性的应用        1). 链表的封装(Leetcode第二题)        2). 栈的封装        3). 队列的封装        4). 二叉树的封装与先序遍历    3. 高级特性        1). @classmethod和@staticmethod(类方法和静态方法)        2). @property类属性        3). 单例模式: 一个类只能实例化一个对象            基于装饰器            基于new方法"""

转载地址:http://ghjxi.baihongyu.com/

你可能感兴趣的文章
Java虚拟机之自动内存管理
查看>>
Java虚拟机之内存分配详解
查看>>
Java虚拟机之垃圾收集器
查看>>
Java虚拟机之常见参数配置
查看>>
Java虚拟机之性能监控工具
查看>>
性能优化之Java程序优化细节(珍藏版)
查看>>
SSO单点登录
查看>>
jmap错误:unknown CollectedHeap type : class sun.jvm.hotspot.gc_interface.CollectedHeap
查看>>
Intellij IDEA中查看System.gc()堆栈日志
查看>>
MySQL死锁的案例
查看>>
Ant环境安装(Windows10+CentOS7)
查看>>
CentOS安装MySQL客户端
查看>>
Docker启动报错:SELinux is not supported with the overlay2 graph driver
查看>>
CentOS7安装hadoop2.7.3-单机版
查看>>
深入理解HDFS原理
查看>>
Intellij IDEA连接Hadoop HDFS实现本地调试
查看>>
MongoDB数据类型
查看>>
MongoDB的java客户端连接池配置说明
查看>>
MongoDB在CentOS7下的yum方式和压缩包方式安装
查看>>
MongoDB安全权限设置及密码重置方法
查看>>