昨日内容

组合

  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. 关于瀑布流的布局原理分析(纯CSS瀑布流与JS瀑布流)

    瀑布流 又称瀑布流式布局,是比较流行的一种网站页面布局方式.即多行等宽元素排列,后面的元素依次添加到其后,等宽不等高,根据图片原比例缩放直至宽度达到我们的要求,依次按照规则放入指定位置. 为什么使用瀑 ...

  2. 死磕 java同步系列之Phaser源码解析

    问题 (1)Phaser是什么? (2)Phaser具有哪些特性? (3)Phaser相对于CyclicBarrier和CountDownLatch的优势? 简介 Phaser,翻译为阶段,它适用于这 ...

  3. # C# 中的Task创建指南

    本文还处于草稿阶段,难免还有错误修改改正,逻辑还不是很清晰,笔者会努力完善,长期更新! [0000] 前言 标题起得有些"大",意在集大家的力量,总结出来一份关于Task相对&qu ...

  4. Android测试环境配置

    测试是软件开发中非常重要的一部分,Android中是使用junit测试框架,本文使用的是junit4和Android Studio.Android测试主要分两类本地测试和Instrumented测试, ...

  5. 【译】微软的Python入门教程(一)

    Getting started with Python(Python入门) Overview 概述 The series of videos on Channel 9 is designed to h ...

  6. Linux的命令(待更新)

    本文说明: ①本文格式: 序号.命令 详解,用文字或者代码 举例: ②本文索引: 1.设置IP 2.ps -aux 3.grep 4. | 1.设置IP 如果本地网卡eth0已经启动,就可以用下面的命 ...

  7. 设计模式----行为型模式之命令模式(Command Pattern)

    下面来自head first设计模式的命令模式一章节. 定义 将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 类图 注: 1. ...

  8. 创建一个 Laravel 项目

    创建一个 Laravel 项目,首先需要安装 Composer ,如果没有安装的参考 https://docs.phpcomposer.com/00-intro.html 一.安装 Laravel 安 ...

  9. drf 框架

    一. drf简介 drf框架,全程: django-rest framework  ,   rest是插件名字,django插件的名字叫rest,framework是框架的意思 二. 接口 在平时生活 ...

  10. vue父子组件钩子函数的执行顺序

    加载渲染过程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount-& ...