昨日内容

组合

  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. Centos 7 配置tomcat服务器

    1.首先查看当前系统版本 uname -a 2.安装之前查看系统是否安装了java rpm -qa |grep java rpm -qa |grep jdk rpm -qa |grep gcj 如果没 ...

  2. 『TensorFlow2.0正式版教程』极简安装TF2.0正式版(CPU&GPU)教程

    0 前言 TensorFlow 2.0,今天凌晨,正式放出了2.0版本. 不少网友表示,TensorFlow 2.0比PyTorch更好用,已经准备全面转向这个新升级的深度学习框架了. ​ 本篇文章就 ...

  3. 03-css的继承性和层叠性

    一.继承性 css中所谓的继承,就是子集继承父级的属性. 可以继承的属性:color.font-xxx.text-xxx.line-xxx.(主要是文本级的标签元素) 但是,像一些盒子元素属性,定位的 ...

  4. lcy各种要填的坑

    莫比乌斯反演.FFT/NTT/FWT/FMT/ 数论容斥复习写题 概率期望复习写题 总结一下dp 看斜率优化.四边形不等式 网络流写题 字符串博客写完,写题 lh老师的课件啃完写题 考前打打正睿模拟赛

  5. python——代理ip获取

    python爬虫要经历爬虫.爬虫被限制.爬虫反限制的过程.当然后续还要网页爬虫限制优化,爬虫再反限制的一系列道高一尺魔高一丈的过程. 爬虫的初级阶段,添加headers和ip代理可以解决很多问题. 贴 ...

  6. Spring Boot (十): Spring Boot Admin 监控 Spring Boot 应用

    Spring Boot (十): Spring Boot Admin 监控 Spring Boot 应用 1. 引言 在上一篇文章<Spring Boot (九): 微服务应用监控 Spring ...

  7. InfluxDB从原理到实战 - 什么是InfluxDB

    0x00 什么是InfluxDB InfluxDB是一个由InfluxData开发的开源时序型数据库,专注于海量时序数据的高性能读.高性能写.高效存储与实时分析等,在DB-Engines Rankin ...

  8. 【solved】must have one register DataBase alias named `default`

    beego在初始化MySQL数据库时报错处理 1.报错提示: ... [ORM]2019/10/11 08:42:52 register db Ping `default`, dial tcp 192 ...

  9. Fcitx使用搜狗词库与皮肤

    在 \(\text{Linux}\) 环境下,\(\text{Fcitx}\) 确实是最好用的开源输入法之一.然而 \(\text{Windows}\) 下的巨头输入法 -- 搜狗,对 \(\text ...

  10. 记录 java 安卓 各类引用包报错处理方法 例如 android.support.v4.app.+ ,io.reactivex.+

    可能导致的原因: 1. 引用包不存在(存在也报错就是 版本不对) 2.有资源文件 重名,报错之类的问题 3. 别人提交了资源文件或者配置文件(这是最常见的,特别是新手,我也是),后续遇到再加 解决方法 ...