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面向对象之魔法方法的更多相关文章

  1. Python面向对象之魔法方法/双下方法

    1.__new__ and __init__ 这两个方法都是在实例化的时候执行,__new__ 在 __init__ 之前执行,并且 如果实例化的时候封装属性,__new__也是必须要传的,而且__n ...

  2. 洗礼灵魂,修炼python(40)--面向对象编程(10)—定制魔法方法+time模块

    定制魔法方法 1.什么是定制魔法方法 首先定制是什么意思呢?其实就是自定义了,根据我们想要的要求来自定义.而在python中,其实那些所谓的内置函数,内置方法,内置属性之类的其实也是自定义出来的,不过 ...

  3. 洗礼灵魂,修炼python(37)--面向对象编程(7)—了解魔法方法

    也许上一篇博文提到的property内置函数的用法你还觉得记忆犹新,那么有没有更多的类似的方法呢?有的,就是本篇文章要说的魔法方法 魔法方法 1.什么是魔法方法 (其实前面已经提到多次,每次我都是说暂 ...

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

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

  5. 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)

    面向对象知识 封装 封装的原理是,其成员变量代表对象的属性,方法代表这个对象的动作真正的封装是,经过深入的思考,做出良好的抽象(设计属性时用到),给出“完整且最小”的接口,并使得内部细节可以对外透明( ...

  6. python基础之面向对象(一)(概念、实例、魔法方法)

    一.面向对象概念理解 1.面向对象和面向过程 面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么 基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式 优点:复杂的过程流程化 ...

  7. 洗礼灵魂,修炼python(39)--面向对象编程(9)—魔法方法表

    好的,不多说,大招来了,几乎完整的魔法方法: 基本的魔法方法 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Defi ...

  8. 洗礼灵魂,修炼python(38)--面向对象编程(8)—从算术运算符进一步认识魔法方法

    上一篇文章了解了魔法方法,相信你已经归魔法方法至少有个概念了,那么今天就进一步的认识魔法方法.说这个之前,大脑里先回忆一下算术操作符. 什么是算术操作符?忘记没有?忘记了的自己倒回去看我前面的博文或者 ...

  9. Python基础:面向对象基础 (一) 类及其属性和魔法方法

    定义类,添加和获取对象属性 # 定义类 格式如下 # class 类名: # 方法列表 # 新式类定义形式 # info 是一个实例方法,第一个参数一般是self,表示实例对象本身 class Her ...

  10. CSIC_716_20191129【面向对象高级----反射、类的内置方法(魔法方法)、单例模式】

    反射 反射是通过'字符串'对 对象的属性进行操作,反射有四个内置的方法. hasattr 通过字符串 判断对象的属性或者方法是否存在 getattr 通过字符串  获取对象的属性或者方法        ...

随机推荐

  1. 在PyQt5中使用Pandas时的几个坑

    最近在看Python GUI编程,在用到PyQt5+Pandas时遇到一些问题.这里把问题和解决方法整理一下.备查. (好像不能上传附件,内容只好写在下面了.) 在PyQt5中使用Pandas时的几个 ...

  2. 点赞和取消点赞实现Redis缓存(只思路)

    思路:点赞.取消点赞 --> Redis --> (每两个小时)存到数据库(MySQL),所以就相当于每次查询或者存储都需要先经过Redis,而查询的目的是为了判断用户的点赞状态(已点赞o ...

  3. MinIO监控指南

    官方文档地址:http://docs.minio.org.cn/docs/master/minio-monitoring-guide MinIO服务器通过端点公开监视数据.监视工具可以从这些端点中选择 ...

  4. 安装skywalking(测试使用)

    官方下载地址:https://skywalking.apache.org/downloads/ 需要: JDK8到JDK12已测试,其他版本未测试. # 在线安装jdk8 rpm -ivh https ...

  5. 使用Portainer管理其他主机的docker应用有两种方式

    官方文档地址:https://docs.portainer.io/v/ce-2.9/admin/environments/add/docker 第一种方式 是在其他主机的docker 启动中放开237 ...

  6. PAT (Basic Level) Practice 1005 继续(3n+1)猜想 分数 25

    卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对 n=3 进行验证的时 ...

  7. LeetCode - 数组遍历

    1. 485. 最大连续 1 的个数 1.1 分析题意 首先:我们求的是连续的1的个数,所以我们不能也没必要对数组进行排序: 其次:只要求求出最大连续1的个数,并不要求具体的区间数目,所以我们只需要用 ...

  8. Node.js(二)express

    npm init -y(初始化项目) npm install express(引入express) npx express-generator -e(自动生成模板.添加对 ejs 模板引擎的支持) a ...

  9. 详解平衡二叉树(AVL tree)平衡操作(图+代码)

    * 左左就右旋,右右就左旋 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int max ...

  10. 浅谈-动态路由之OSPF的理解

    路由 在网络中,路由相当于就是一张地图,让路由器知道这个对应的IP数据包应该往哪端口.网段走:而这个"地图"我们称之为路由表,不同的目的IP路由表的下一个跳也不同,其生成方式有又有 ...