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):
pass def __int__(self):
return 1111 def __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 = name
self.age = age def __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 = name
self.age = age
self.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 = name
self.age = age def __getitem__(self, item):
return item+10 def __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 = name
self.age = age def __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=Foo
print(123)
pass def __call__(self, *args, **kwargs):
# self=Foo
r = self.__new__()
self.__init__() # class Foo(object,metaclass=MyType):
def __init__(self):
pass def __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__。

类python中高级用法的更多相关文章

  1. Python高级用法总结

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

  2. Python import用法以及与from...import的区别

    Python import用法以及与from...import的区别 在python用import或者from...import来导入相应的模块.模块其实就是一些函数和类的集合文件,它能实现一些相应的 ...

  3. python argparse用法总结

    转:python argparse用法总结 1. argparse介绍 argparse是python的一个命令行解析包,非常适合用来编写可读性非常好的程序. 2. 基本用法 prog.py是我在li ...

  4. Anaconda下载及安装及查看安装的Python库用法

    Anaconda下载及安装及查看安装的Python库用法 Anaconda 是一个用于科学计算的 Python 发行版,提供了包管理与环境管理的功能.Anaconda 利用 conda 来进行 pac ...

  5. python enumerate用法总结【转】

    enumerate()说明 enumerate()是python的内置函数 enumerate在字典上是枚举.列举的意思 对于一个可迭代的(iterable)/可遍历的对象(如列表.字符串),enum ...

  6. Delphi 类的类 class of 用法

    http://blog.csdn.net/blue_morning/article/details/8815609 Delphi 类的类 class of 用法   这个概念本来在一个关于Delphi ...

  7. 【opencv基础】Rect类的神奇用法

    前言 最近看github上源码发现对两个cv::Rect使用相与(&)操作,猛地感觉自己蒙啦,Rect类还有这种神奇用法?!翻看opencv官网Rect类,果然如此! opencv中Rect类 ...

  8. Java文件(io)编程——File类的基本用法

    1.首先了解文件流的相关概念: 2.文件File类的基本用法 public class Demo_1 { public static void main(String[] args) { //创建一个 ...

  9. Python高级用法

    Python高级用法 三元表达式 x = 10 y = 20 print(x if x > y else y) x = 100 y = 20 print(x if x > y else y ...

随机推荐

  1. MathExam6378

    我的第一个程序 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 15 10 • Estima ...

  2. 20162316刘诚昊 Java Queue的测试

    交慢了一步..

  3. Chapter 11 软件演化

    软件一直在不断地演化发展,人们通常通过软件维护和软件再工程解决软件的缺陷.软件维护可以分为改正性维护.适应性维护和完善性维护几种类型.软件维护受开发过程影响大.软件维护困难大.软件维护成本高.软件维护 ...

  4. object-oriented second work

    work request github enter 这次作业做过,不过以前是用数组写的,当我用双向链表写这题时,刚交上去一直出错,后面我又改了改,最后一点一致凑,后面有同学告诉我在构建链表后要判断链表 ...

  5. 第一次spring冲刺第9天

    明天是这个阶段的最后一天了,今天讨论关于容错的方面,例如输入空白或其他字符等方面会出现的问题 ,部分代码如下: public void checkout(int trueResult) { Strin ...

  6. iOS- 什么是GitHub?关于它的自我介绍「初识 GitHub」

    1 前言 我一直认为 GitHub 是程序员必备技能,程序员应该没有不知道 GitHub 的才对,我当初接触 GitHub 也大概工作了一年多才开始学习使用,我读者里很多是初学者,而且还有很多是在校大 ...

  7. jQuery 版本选择与常见插件库总结

    在日常的开发中jQuery作为一个流行多年的轻量级 JavaScript 库,使用十分的普遍,主要源于它的便捷性和实用性非常高. 在此总结一些关于jQuery版本的区别和选择的建议,以及一些常见插件库 ...

  8. PHP学习心得2

    对于PHP的语法结构,刚开始真的很不习惯,真搞不懂为什么每个变量之前都要加个“$”符号,每个语句写完之后都必须加上“分号”来表示此句已经结束,还有,PHP对字母的大小写是敏感的,写的时候一定要注意大小 ...

  9. bing 搜索引擎 无法访问 bug

    bing 搜索引擎 无法访问 bug 自从 Google 不好正常使用以后, 一直在使用 bing, 今天突然就 无法访问了,怎么回事?被黑了? ... loading https://cn.bing ...

  10. js & auto copy

    js & auto copy https://developer.mozilla.org/zh-CN/docs/Web/Events/copy Ctrl + C Command + C doc ...