昨日内容

组合

  1. 一个类产生的对象时另一个对象的属性
  2. 目的:减少代码冗余

封装

  1. 把一堆属性封装到一个对象中

  2. 目的:方便存取(通过对象.属性的方式对数据进行存取)

  3. 如何封装

    1. 类内部定义
    2. 通过对象.属性的方式添加属性
  4. 访问限制机制

    1. 在类内部,凡是以__开头的属性都不能被外部直接访问,python对其作了变形(隐藏)

      例如:__属性 变形为 __类名__属性

    2. 目的:防止使用者在外部对隐私数据进行访问,保护数据安全

property装饰器

用来装饰在类内部的函数中,使该方法不用加括号调用

多态

  1. 同种事物的多种形态

  2. 目的:让父类定义一套标准,子类遵循父类定义的标准

    ​ 总结:为了统一类的编写规范

  3. 实现方式

    1. 子类继承父类,遵循父类的方法
    2. 子类继承抽象类,强制子类必须遵循父类的标准
    3. 鸭子类型

鸭子类型

  1. 只要看起来像鸭子,那么就是鸭子类型
  2. 在不知道对象是什么情况下,拥有相同的方法

今日内容

classmethod

  1. 类内部方法的装饰器,是该方法绑定给类使用(类的绑定方法)
  2. 作用:由类来调用,会将类当作第一个参数传给该方法
class People:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    @classmethod
    def tell_info(cls):
        print(cls)

 p =People('wick',24)
p.tell_info()
People.tell_info()      

staticmethod

  1. 类内部方法的装饰器,使该方法不与类和对象绑定
  2. 作用:类和对象调用,不用传参数
import uuid
import hashlib
class People:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    @staticmethod
    def create_id():
        uuid_id = uuid.uuid4()
        return uuid_id

 p =People('wick',24)
print(p.create_id())
print(People.create_id())

面对对象高级

isinstance

python内置的函数,可以传入两个参数,用于判断参数1是否是参数2的一个实例(判断一个对象是否是一个类的实例)

class Foo:
    pass

class Goo:
    pass

foo_obj = Foo()
print(Foo.__dict__)  # 获取当前类的属性
print(foo_obj.__class__)  # 获取当前对象所属的类
print(isinstance(foo_obj,Foo))  # True
print(isinstance(foo_obj,Goo))  # False

issubclass

python内置函数,可以传入两个参数,用于判断参数1是否是参数2的子类(判断一个类是否是另一个类的子类)

class Foo:
    pass

class Goo:
    pass

print(issubclass(Goo,Foo))  # False

反射(重要)

指的是通过“字符串”对对象或类的属性进行操作

  1. hasattr:通过字符串判断对象或类是否存在该属性
  2. getattr:通过字符串,获取对象或类的属性
  3. setattr:通过字符串,设置对象或类的属性
  4. delattr:通过字符串,删除对象或类的属性
class People:
    country = 'China'
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

p = People('wick',24,'man')

# 普通方式
print('name' in p.__dict)  # True
print('country' in People.__dict__)  # True
# hasattr
print(hasattr(p,'name'))  # True

# 普通方式
print(p.__dict__.get('name'))  # wick
print(p.__dict__.get('name1','9'))  # 9
# getattr
print(getattr(p,'name','tank'))  # wick
print(getattr(p,'name1','tank'))  # tank

# 普通方式
p.level = 10
print(p.level)  # 10
# setattr
setattr(p,'sal','3.0')
print(hasattr(p,'sal'))  # True

# 普通方式
del p.level
print(hasattr(p,'level'))  # False
# delattr
delattr(p,'sal')
print(hasattr(p,'sal'))  # False
#反射小练习
class Movie:
    def input_cmd(self):
        print('输出命令:')
        while True:
            cmd = input('请输入执行方法名:').strip()
            if hasattr(self,cmd):
                func = getattr(self,cmd)
                func()
            else:
                print('命令错误,请重新输入')

    def upload(self):
        print('电影开始上传')

    def download(self):
        print('电影开始下载')

movie_obj = Movie()
movie_obj.input_cmd()             

魔法方法(类的内置方法)

  1. 凡是在类内部定义,以__开头和__结尾的方法都称之为魔法方法,也叫类的内置方法

  2. 作用:魔法方法会在某些条件成立时触发

    __init__:在调用类时触发

    __str__:会在打印对象时触发,必须要返回值,必须是字符串类型

    __del__:对象被销毁前执行该方法

    __getattr__:会在对象.属性时,属性没有才会触发

    __setattr__:会在对象.属性 = 属性时触发

    __call__:会在对象被调用时触发

    __new__:会在__init__执行前触发

    class Foo(object):
    
        def __new__(cls, *args, **kwargs):
            print(cls)
            return object.__new__(cls)  # 真正产生一个空对象
    
        # 若当前类的__new__没有return一个空对象时,则不会触发。
        def __init__(self):
            print('在调用类时触发...')
    
        # def __str__(self):
        #     print('会在打印对象时触发...')
        #     # 必须要有一个返回值, 该返回值必须是字符串类型
        #     return '[1, 2, 3]'
    
        def __del__(self):
            print('对象被销毁前执行该方法...')
    
        def __getattr__(self, item):
            print('会在对象.属性时,“属性没有”的情况下才会触发...')
            print(item)
            # 默认返回None, 若想打印属性的结果,必须return一个值
            return 111
    
        # 注意: 执行该方法时,外部“对象.属性=属性值”时无效。
        def __setattr__(self, key, value):
            print('会在 “对象.属性 = 属性值” 时触发...')
            print(key, value)
            print(type(self))
            print(self, 111)
            self.__dict__[key] = value
    
        def __call__(self, *args, **kwargs):
            print(self)
            print('调用对象时触发该方法...')

单例模式

  1. 单例模式指的是单个实例,实例指的是调用类产生的对象

    实例化多个对象会产生不同的内存地址,单例可以让所有调用者在调用类产生对象时都指向同一个内存地址,比如打开文件

2 .目的:为了减少内存的只能用

# 要从配置文件中获取三个同样的文件名,会开辟三个空间

# 单例方式1
class File:
    __instance = None

    @classmethod
    def singleton(cls,file_name):
        if not cls.__instance:
            obj = cls(file_name)
            cls.__instance = obj
        return cls.__instance

    def __init(self,file_name,mode='r',encoding = 'utf-8'):
        self.file_name = file_name
        self.mode = mode
        self.encoding = encoding

    def open(self):
        self.f = open(self.file_name,self.mode,encoding = self.encoding)

obj1 = File.singleton('jason雨后的小故事.txt')  # singleton(cls)
obj2 = File.singleton('jason雨后的小故事.txt')  # singleton(cls)
obj3 = File.singleton('jason雨后的小故事.txt')  # singleton(cls)
# obj1 = File('jason雨后的小故事.txt')
# obj2 = File('jason雨后的小故事.txt')
# obj3 = File('jason雨后的小故事.txt')   

print(obj1)
print(obj2)
print(obj3)
        
# 单例方式2
class File:
    __instance = None

    def __new__(cls,*args):
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance 

    def __init(self,file_name,mode='r',encoding = 'utf-8'):
        self.file_name = file_name
        self.mode = mode
        self.encoding = encoding

    def open(self):
        self.f = open(self.file_name,self.mode,encoding = self.encoding)

obj1 = File.singleton('jason雨后的小故事.txt')  # singleton(cls)
obj2 = File.singleton('jason雨后的小故事.txt')  # singleton(cls)
obj3 = File.singleton('jason雨后的小故事.txt')  # singleton(cls)
# obj1 = File('jason雨后的小故事.txt')
# obj2 = File('jason雨后的小故事.txt')
# obj3 = File('jason雨后的小故事.txt')    

print(obj1)
print(obj2)
print(obj3)

面对对象高阶+反射+魔法方法+单例(day22)的更多相关文章

  1. python魔法方法-单目运算及一般算数运算

    在比较的魔法方法中,我们讨论了魔法方法其实就是重载了操作符,例如>.<.==等.而这里,我们继续讨论有关于数值的魔法方法. 1.单目运算符或单目运算函数 __pos__(self) 实现一 ...

  2. java新手笔记11 类的静态属性、方法(单例)

    1.Person类 package com.yfs.javase; public class Person { String name;//每个对象上分配 与对象绑定 int age; char se ...

  3. python之魔法方法介绍

    1.1. 简介 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加“魔法”的特殊方法. 它们经常是两个下划线包围来命名的(比如 __init__ , __lt__ ) ...

  4. python_面向对象魔法方法指南

    原文: http://www.rafekettler.com/magicmethods.html 原作者: Rafe Kettler 翻译: hit9 原版(英文版) Repo: https://gi ...

  5. 自己动手写一个简易对象关系映射,ORM(单例版和数据库池版)

    准备知识 DBUtils模块  <<-----重点 DBUtils是Python的一个用于实现数据库连接池的模块 此连接池有两种连接模式: DBUtils提供两种外部接口: Persist ...

  6. Java设计模式:Singleton(单例)模式

    概念定义 Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象.因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式. 单例 ...

  7. 十次艳遇单例设计模式(Singleton Pattern)

    1.引言 单例设计模式(Singleton Pattern)是最简单且常见的设计模式之一,在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访 ...

  8. 再看 Java 中的单例

    此前面试遇到了单例问题,本以为已经背的滚瓜烂熟,没想到被问单例如何避免被反射和序列化破坏,虽然后来还是等到了通知,但还是复习一下单例的实现方式,并学习防止反射和序列化破坏的手段. 基本实现方式 其他相 ...

  9. JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖

    JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有 ...

随机推荐

  1. eclipse导入别的项目后发现jdk版本不一样,该如何解决呢?

    当我们导入其他人的项目的时候,发现导入的项目的jdk版本与我们使用电脑上的版本不同,该如何解决呢? 选中项目右键 --> Properties --> Build Path --> ...

  2. 轻松部署calico

    一.资源 官方文档 https://docs.projectcalico.org/v3.8/getting-started/kubernetes/installation/integration 二. ...

  3. springboot启动报错 Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

    新建了一个springboot项目报一下错误: Failed to configure a DataSource: 'url' attribute is not specified and no em ...

  4. uC/OS-III 软件定时器(三)

    软件定时器是uC/OS 操作系统的一个内核对象,软件定时器是基于时钟节拍和系统管理创建的软件性定时器,理论上可以创建无限多个,操作简单,但精准度肯定比硬件定时稍逊一筹. 原理和实现过程 要用到的函数: ...

  5. ServiceStack.Redis高效封装和简易破解

    1.ServiceStack.Redis封装 封装的Redis操作类名为RedisHandle,如下代码块(只展示部分代码),它的特点: 1)使用连接池管理连接,见代码中的PooledClientMa ...

  6. 织梦DEDE分类信息实现联动筛选(支持多条件多级选项)解决方案

    发布时间:2017-03-25 来源:未知 浏览:404 关键词: 很多织梦建站的站长在做产品列表页的时候,产品分类多而且都是关联的,用户不能快速的找到自己需要的东西,很多情况下都需要用到筛选功能,织 ...

  7. MySQL-时区导致的时间前后端不一致

    背景 今天早上刚上班,就被同事提示,程序的日期处理有问题.数据库里日期为:2019-05-21 11:00:00 而前端显示的日期为:2019-05-21 16:00:00 分析 那肯定是和时区相关了 ...

  8. JPG和PNG特性分析及适用范围

    个人博客: http://mcchen.club JPG的特性   ----有损压缩 1.支持摄影图像或写实图像的高级压缩,并且可利用压缩比例控制图像文件大小. 2.有损压缩会使图像数据质量下降,并且 ...

  9. Java的动手动脑

    动手动脑及课后实 仔细阅读示例: EnumTest.java,运行它,分析运行结果? public class EnumTest { public static void main(String[] ...

  10. Stock Charts

    Description You're in the middle of writing your newspaper's end-of-year economics summary, and you' ...