1. __call__用法

class Foo:def __init__(self):print('init')def __call__(self, *args, **kwargs):print('call')# obj = Foo()
# obj()
Foo()()

类对象后面加()是执行类中的__call__方法。用处稍后说

2. __int__和__str__方法

class Foo:def __init__(self):passdef __int__(self):return 1111def __str__(self):return 'hello world'obj = Foo()
print(obj, type(obj))# int,对象,自动执行对象的 __int__方法,并将返回值赋值给int对象
r = int(obj)
print(r)
i = str(obj)
print(i)

class Foo:

def __init__(self,n,a):
        self.name =n
        self.age =a

def __str__(self):
        return '%s-%s' %(self.name,self.age,)

obj = Foo('pis', 18)
print(obj) #print(str(obj)) str(obj)   obj中__str__,并获取其返回值

3. 运算符重载举例__add__,__del__析构方法

class Foo:def __init__(self, name,age):self.name = nameself.age = agedef __add__(self, other):return Foo(self.name, other.age)def __del__(self):print('析构方法') # 对象被销毁()时,自动执行

obj1 = Foo('hello', 19)
obj2 = Foo('world', 66)r = obj1 + obj2
# 两个对象相加时,自动执行第一个对象的的 __add__方法,并且将第二个对象当作参数传递进入
print(r,type(r))

4. __dict__方法查看封装内容

class Foo:def __init__(self, name,age):self.name = nameself.age = ageself.n = 123# obj = Foo('pis', 18)
#
# d = obj.__dict__
# print(d)# ret = Foo.__dict__
# print(ret)

5. __getitem__,__setitem__,__delitem__

class Foo:def __init__(self, name,age):self.name = nameself.age = agedef __getitem__(self, item):return item+10def __setitem__(self, key, value):print(key,value)def __delitem__(self, key):print(key)
li = Foo('pis', 18)
r= li[8] # 自动执行li对象的类中的 __getitem__方法,8当作参数传递给item
print(r)
li[100] = "asdf"
del li[999]
class Foo:

    def __init__(self, name,age):        self.name = name        self.age = age

    def __getitem__(self, item):        # return item+10        # 如果item是基本类型:int,str,索引获取        # slice对象的话,切片        if type(item) == slice:            print('调用这希望内部做切片处理')            print(item.start)            print(item.stop)            print(item.step)        else:            print('调用这希望内部做索引处理')

    def __setitem__(self, key, value):        print(key,value)

    def __delitem__(self, key):        print(key)

li = Foo('pis', 18)li[123]li[1:4]

6. __iter__方法

class Foo:def __init__(self, name,age):self.name = nameself.age = agedef __iter__(self):return iter([11,22,33])
li = Foo('pis', 18)
# 如果类中有 __iter__ 方法,将对象=》可迭代对象,没有则报错
# 对象.__iter__() 的返回值: 迭代器
# for 循环,迭代器,next
# for 循环,可迭代对象,对象.__iter__(),迭代器,next
# 1、执行li对象的类F类中的 __iter__方法,并获取其返回值
# 2、循环上一步中返回的对象
for i in li:print(i)
"""

7. metaclass 作用

class MyType(type):def __init__(self,*args, **kwargs):# self=Fooprint(123)passdef __call__(self, *args, **kwargs):# self=Foor = self.__new__()self.__init__()#

class Foo(object,metaclass=MyType):def __init__(self):passdef __new__(cls, *args, **kwargs):return '对象'def func(self):print('hello world')obj = Foo()

在创建类时,obj为Foo对象,而Foo为metaclass对象,默认为type,即metaclass=type,可以用自己创建的类为metaclass,继承type后加上自己的内容即可。

  我们看到的是创建对象时直接执行__init__(),实际上Foo是type的对象,先执行type的__init__,

然后Foo(),由上面知道是执行type中的__call__方法。在__call__方法中创建的对象,也就是Foo类的__new__和__init__。

转载于:https://www.cnblogs.com/MY0213/p/7824769.html

类python中高级用法相关推荐

  1. python简单定义_python定义类的简单用法

    python定义的类使用方法: 使用"obj=类名()"语句将类实例化,然后用"obj.函数名"就可以调用类里面定义的各种函数了 示例如下: 将Bili类实例化 ...

  2. Python SQLite 用法

    Python SQLite 用法 具体可以参考网址 代码: #导入 import sqlite3 #连接库,如果数据库不存在,那么它就会被创建,最后将返回一个数据库对象. # test.db:数据路路 ...

  3. import的用法python_Python导入模块,Python import用法(超级详细)

    Python导入模块,Python import用法(超级详细) 使用 Python 进行编程时,有些功能没必须自己实现,可以借助 Python 现有的标准库或者其他人提供的第三方库.比如说,在前面章 ...

  4. python with用法

    @python with用法 python中with可以明显改进代码友好度,比如: [python] view plaincopyprint? with open('a.txt') as f: pri ...

  5. Python高级用法总结

    Python很棒,它有很多高级用法值得细细思索,学习使用.本文将根据日常使用,总结介绍Python的一组高级特性,包括:列表推导式.迭代器和生成器.装饰器. 列表推导(list comprehensi ...

  6. 数据库和python的结合_redis数据库及与python交互用法简单示例

    本文实例讲述了redis数据库及与python交互用法.分享给大家供大家参考,具体如下: redis数据操作 1.string类型:主要存储字符串 操作 命令 设置键值 set key value 设 ...

  7. python输出函数是什么_Python中打印函数使用概述,python,print,用法,总结

    输出的 print 函数总结: 1. 字符串和数值类型 可以直接输出 print(1) 1 print("Hello World") Hello World 2.变量 无论什么类型 ...

  8. Python正则表达式用法详解

    搞懂 Python 正则表达式用法 作者:枫叶云 来源:见文末 Python 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本 ...

  9. 技巧 | Python 字典用法详解(超全)

    文章目录 1.dict.clear() 2.dict.copy() 3.dict.fromkeys() 4.dict.get() 5.dict.items() 6.dict.keys() 7.dict ...

最新文章

  1. 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...
  2. Java try语句的嵌套
  3. 阿里云-变更备案信息记
  4. python爬虫利器p_Python爬虫利器五之Selenium的用法
  5. sql server使用维护计划定时备份完整数据库、差异数据库
  6. 英特尔发布全新英特尔® INDE 2015工具套件
  7. 若要调试此模块,请将其项目生成配置更改为“调试”模式。若要取消显示此消息,请禁用“启动时若没有用户代码则发出警告”调试器选项。...
  8. 软件测试—如何建立软件测试管理体系?
  9. VMware Workstation下载和安装
  10. 药库管理系统登录界面设计
  11. RainMeter — 使用 NotePad ++ 编辑皮肤文件
  12. 日常英语---九、冒险岛link技能导读
  13. 将DVD中的VOB文件无损转换为MP4等常用视频格式的方法
  14. 整站SEO优化方案:整站优化的方案的流行格式
  15. 【历史上的今天】4 月 18 日:第一款交互式电子游戏;IBM 率先研发兆位芯片;硬件公司 Roland 成立
  16. 巴巴腾机器人视频_巴巴腾机器人,没想到你是这样的机器人!
  17. 复旦大学有计算机网络专业,复旦大学计算机网络专业计划..doc
  18. python msp_MSP系统使用python语言实现接口自动化
  19. 山西计算机一级考试试题,2014山西省计算机等级考试试题 二级C试题一点通科目一...
  20. 【技术科普一】什么是石墨烯技术?

热门文章

  1. [转]使用Visual C#制作可伸缩个性化窗体
  2. 【Java】Java中的在Linux和Mac以及Windows上使用File.separator的坑
  3. c语言case语句块,JavaScript使用Switch语句来选择将要执行的代码块
  4. oracle进入rman报错,Oracle学习系列之Rman学习(三)
  5. php7 mcrypt模块_Linux下PHP安装mcrypt扩展模块笔记
  6. 一次有趣的面试经历,当前端面试碰到后端面试官会发生什么?
  7. JavaSE01、如何写一个Java代码
  8. 自定义类型详解:结构体(内存对齐、位段) + 枚举 + 联合
  9. kafka 修改分区_kafka修改分区和副本数
  10. python可以操作word吗_python实现在windows下操作word的方法