Day31面向对象之魔法方法
Day31面向对象之魔法方法
类的常用魔法方法如下
| 序号 | 双下方法 | 触发条件 | 
|---|---|---|
| 1 | init | 对象添加独有数据的时候自动触发 | 
| 2 | str | 对象被执行打印操作的时候自动触发 | 
| 3 | call | 对象加括号调用的时候自动触发 | 
| 4 | getattr | 访问对象不存在的属性时自动触发 | 
| 5 | getattribute | 只要访问对象的名字就会触发(不常用) | 
| 6 | setattr | 给对象添加或者修改数据的时候自动触发 | 
| 7 | enter | 当对象被当做with上下文管理操作的开始自动触发 | 
| 8 | exit | 与enter相反,在上下文管理结束时触发 | 
魔法方法对应的代码实操
1. __init__
class A:
    def __init__(self, name, age):
        self.name = name
        self.age = age
obj = A('almira', 24)
print(obj.__dict__)  # {'name': 'almira', 'age': 24}
2. __str__
class A:
    def __str__(self):
        return '我是类AB'
obj = A()
print(obj)  # 我是类AB
3.__call__
class A:
    cid = 99999  # 定义一个类里面的共有数据属性
    def __call__(self, *args, **kwargs):
        print(self)  # 可以 接受调用的对象本身
        print(args, kwargs)  # 可以接受参数
        return self.cid  # 返回一个返回值
obj = A()  # 类名加括号让变量接受就是产生对象的过程
print(obj(77, 88, name='almira'))  # 当对象被括号调用时自动出发
4.__getattr__
class A:
    cid = 99999
    def __getattr__(self, item):
        return f'没有{item}这个属性'
obj = A()
print(obj.cid)  # 99999
print(obj.ciddd)  # 没有ciddd这个属性
5. __getattribute__
class A:
    def __getattribute__(self, item):
        return '你以为你是谁???'
obj = A()
print(obj.cid)  # 你以为你是谁???
print(obj.cccid)  # 你以为你是谁???
6. __setattr__
class A:
    def __init__(self, name):
        self.name = name
    def __setattr__(self, key, value):
        print('__setattr__')
        print(key, value)
obj = A()
print(obj)
7. ___enter__ & 8. __exit__
class A:
    def __init__(self, name):
        self.name = name
    def __enter__(self):
        print('enter')
        return 123
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('exit')
        return 234
a = A()
with a as f:
    print(f)
魔法方法相关笔试题
1.补全下列代码使得运行不报错即可
class Context:
pass
with Context() as f:
f.do_something() class Context:
def do_something(self):
pass
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
pass
with Context() as f:
f.do_something() 2.自定义字典类型并让字典能够通过句点符的方式操作键值对
class MyDict(dict):
def __setattr__(self, key, value):
self[key] = value def __getattr__(self, item):
return self.get(item)
obj = MyDict()
obj.name = 'jason'
obj.pwd = 18
obj.hobby = 'read'
# print(obj)
print(obj.name)
print(obj.pwd)
print(obj.hobby)
# print(obj)
# print(obj) # 字典存储的数据 {}
# print(obj.__dict__) # 字典对象名称空间 {'name': 'jason'} print(type(obj))
元类以及创建元类
1.元类的定义
#定义的类其实是type产生的,所以我们把产生类的类(type)叫做元类 2.创建元类的两种方式
#方式一:通过关键字class创建
class Student:
name = 'almira'
age = 24 obj = Student()
print(obj.name, obj.age)
print(Student.__dict__) #方式二:通过关键字type创建
# 语法结构:type(类名,类的父类,类的名称空间)
cls = type('Student', (object,), {'name': 'almira'})
print(cls)
print(cls.__dict__) """
了解知识:名称空间的产生
1.手动写键值对
针对绑定方法不好定义
2.内置方法exec
能够运行字符串类型的代码并产生名称空间
"""
魔法方法之双下new
class MyMetaclass(type):
def __call__(self, *args, **kwargs):
obj = self.__new__(self) # 1.产生一个空对象(骨架)
self.__init__(obj, *args, **kwargs) # 2.调用__init__给对象添加独有的数据(血肉) return obj # 3.返回创建好的对象 class Student(metaclass=MyMetaclass):
def __init__(self, name):
self.name = name obj = Student('almira')
print(obj.name)
Day31面向对象之魔法方法的更多相关文章
- Python面向对象之魔法方法/双下方法
		
1.__new__ and __init__ 这两个方法都是在实例化的时候执行,__new__ 在 __init__ 之前执行,并且 如果实例化的时候封装属性,__new__也是必须要传的,而且__n ...
 - 洗礼灵魂,修炼python(40)--面向对象编程(10)—定制魔法方法+time模块
		
定制魔法方法 1.什么是定制魔法方法 首先定制是什么意思呢?其实就是自定义了,根据我们想要的要求来自定义.而在python中,其实那些所谓的内置函数,内置方法,内置属性之类的其实也是自定义出来的,不过 ...
 - 洗礼灵魂,修炼python(37)--面向对象编程(7)—了解魔法方法
		
也许上一篇博文提到的property内置函数的用法你还觉得记忆犹新,那么有没有更多的类似的方法呢?有的,就是本篇文章要说的魔法方法 魔法方法 1.什么是魔法方法 (其实前面已经提到多次,每次我都是说暂 ...
 - python_面向对象魔法方法指南
		
原文: http://www.rafekettler.com/magicmethods.html 原作者: Rafe Kettler 翻译: hit9 原版(英文版) Repo: https://gi ...
 - 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)
		
面向对象知识 封装 封装的原理是,其成员变量代表对象的属性,方法代表这个对象的动作真正的封装是,经过深入的思考,做出良好的抽象(设计属性时用到),给出“完整且最小”的接口,并使得内部细节可以对外透明( ...
 - python基础之面向对象(一)(概念、实例、魔法方法)
		
一.面向对象概念理解 1.面向对象和面向过程 面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么 基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式 优点:复杂的过程流程化 ...
 - 洗礼灵魂,修炼python(39)--面向对象编程(9)—魔法方法表
		
好的,不多说,大招来了,几乎完整的魔法方法: 基本的魔法方法 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Defi ...
 - 洗礼灵魂,修炼python(38)--面向对象编程(8)—从算术运算符进一步认识魔法方法
		
上一篇文章了解了魔法方法,相信你已经归魔法方法至少有个概念了,那么今天就进一步的认识魔法方法.说这个之前,大脑里先回忆一下算术操作符. 什么是算术操作符?忘记没有?忘记了的自己倒回去看我前面的博文或者 ...
 - Python基础:面向对象基础 (一) 类及其属性和魔法方法
		
定义类,添加和获取对象属性 # 定义类 格式如下 # class 类名: # 方法列表 # 新式类定义形式 # info 是一个实例方法,第一个参数一般是self,表示实例对象本身 class Her ...
 - CSIC_716_20191129【面向对象高级----反射、类的内置方法(魔法方法)、单例模式】
		
反射 反射是通过'字符串'对 对象的属性进行操作,反射有四个内置的方法. hasattr 通过字符串 判断对象的属性或者方法是否存在 getattr 通过字符串 获取对象的属性或者方法 ...
 
随机推荐
- Kubernetes 零宕机滚动更新
			
转载自:https://www.qikqiak.com/post/zero-downtime-rolling-update-k8s/ 软件世界的发展比以往任何时候都快,为了保持竞争力需要尽快推出新的软 ...
 - 第二章:视图层 - 9:动态生成CSV文件
			
CSV (Comma Separated Values),以纯文本形式存储数字和文本数据的存储方式.纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样的数据.CSV文件由任意数目的记录组成,记 ...
 - nexus清理释放磁盘空间
			
应用背景 自建的maven私服(或者叫私仓)nexus在使用过程中,因很多服务不断迭代更新上传jar包至nexus中,底层存放在一个叫Blob Stores的存储中,最近发现该存储已增大至好几百G,有 ...
 - SonarQube 的安装、配置及 Maven 项目的使用
			
转载自:https://cloud.tencent.com/developer/article/1010612 1.SonarQube 介绍 SonarQube 是一个用于管理源代码质量开放平台,它可 ...
 - Docker | 容器数据卷详解
			
什么是容器数据卷 从docker的理念说起,docker将应用和环境打包成一个镜像,运行镜像(生成容器)就可以访问服务了. 如果数据都存在容器中,那么删除容器,数据就会丢失!需求:数据可以持久化 My ...
 - python基础--简单数据类型预览
			
为了适应更多的使用场景,将数据划分为多种类型,每种类型都有各自的特点和使用场景, 帮助计算机高效的处理和展示数据.(比如数字用于数学运算.字符串用于信息传递.页面文字展示等) 1.数字类型 整型 ...
 - Java I/O(1):模型与流
			
在1990年以前,有一帮工程师们认为未来(1990年以后)会有很多小型设备需要得到电脑操控(不得不说,想法非常超前),鉴于当时市面上并没有任何一款编程语言能够跨平台,而且能够在诸如烤面包机这种小型设备 ...
 - 使用@Param标识参数
			
可以通过@Param注解标识mapper接口中的方法参数 此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值: 以 param1,param2...为键,以参数为 ...
 - Dubbo 02: 直连式
			
直连式 需要用到两个相互独立的maven的web项目 项目1:o1-link-userservice-provider 作为服务的提供者 项目2:o2-link-consumer 作为使用服务的消费者 ...
 - AlphaTensor论文阅读分析
			
AlphaTensor论文阅读分析 目前只是大概了解了AlphaTensor的思路和效果,完善ing deepmind博客在 https://www.deepmind.com/blog/discove ...