1. __doc__ 表示类的描述信息

class Dog(object):
""" 这个类是描述狗这个对象的 """
def func(self):
pass print(Dog.__doc__)
# 输出: 这个类是描述狗这个对象的

2. __module__ 和  __class__ 

  __module__ 表示当前操作的对象在哪个模块

  __class__     表示当前操作的对象的类是什么

class C:

    def __init__(self):
self.name = 'aa'

lib/aa.py

from lib.aa import C

obj = C()
print obj.__module__ # 输出 lib.aa,即:输出模块
print obj.__class__ # 输出 lib.aa.C,即:输出类

index

3. __init__ 构造方法,通过类创建对象时,自动触发执行。

4.__del__ 析构方法,当对象在内存中被释放时,自动触发执行。

5. __call__ 对象后面加括号,触发执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
class Foo:
def __init__(self):
print("__init__") def __call__(self, *args, **kwargs):
print('__call__') obj = Foo() # 执行 __init__
obj() # 执行 __call__

6. __dict__ 查看类或对象中的所有成员   

class Province:
country = 'China' def __init__(self, name,count):
self.name = name
self.count = count
def func(self):
print("func") # 获取类的成员,不包括实例属性
print(Province.__dict__)
# 输出:
# {'__module__': '__main__', 'country': 'China', '__init__': <function Province.__init__ at 0x00000000027EA9D8>,
# 'func': <function Province.func at 0x00000000027EAA60>, '__dict__': <attribute '__dict__' of 'Province' objects>,
# '__weakref__': <attribute '__weakref__' of 'Province' objects>, '__doc__': None} # 获取 对象obj1 的成员,不包括类属性
obj1 = Province("shandong",1000)
print(obj1.__dict__)
# 输出:{'name': 'shandong', 'count': 1000}

7.__str__ 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

class Foo:
def __str__(self):
return 'alex li' obj = Foo()
print obj
# 输出:alex li

8.__getitem__、__setitem__、__delitem__

用于索引操作,如字典。以上分别表示获取、设置、删除数据

class Foo(object):
def __getitem__(self, key):
print('__getitem__', key) def __setitem__(self, key, value):
print('__setitem__', key, value) def __delitem__(self, key):
print('__delitem__', key) obj = Foo()
result = obj['k1'] # 自动触发执行 __getitem__
obj['k2'] = 'alex' # 自动触发执行 __setitem__
del obj['k1'] # 自动触发执行__delitem__

可用于写一个类 封装属于自己的字典,django里面会用到它,用来封装自己的一些底层的东西,用户以为自己是调用的字典,其实是调用的实例。可以对某些key加一些限制,达到使用户可以访问字典,却不能对其进行删除的目的。

9. __new__ \ __metaclass__

class Foo(object):
def __init__(self,name):
self.name = name f = Foo("Alex")

上述代码中,f 是通过 Foo 类实例化的对象,其实,不仅 obj 是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象

如果按照一切事物都是对象的理论:f 对象是通过执行Foo类的构造方法创建,那么Foo类对象应该也是通过执行某个类的 构造方法 创建。

print(type(f)) # 输出:<class '__main__.Foo'>     表示,f 对象由 Foo 类创建
print(type(Foo)) # 输出:<type 'type'> 表示,Foo类对象由 type 类创建

所以,f对象是Foo类的一个实例Foo类对象是 type 类的一个实例,即:Foo类对象 是通过type类的构造方法创建。

那么,创建类就可以有两种方式:

a). 普通方式

class Foo(object):

    def talk(self):
print('hello Alice')

b). 特殊方式

def talk(self):
print('hello Alice') Foo = type('Foo', (object,), {'talk': talk})
#注意:这里的(object,)是元组的形式,必须后面加一个逗号,如果不加,Python会认为(object)是一个值
def talk(self):
print("hello %s" % self.name) def __init__(self,name,age):
self.name = name
self.age = age Foo = type("Foo",(object,),{"talk":talk,"__init__":__init__})

加上构造方法

So ,记住,类 是由 type 类实例化产生

那么问题来了,类默认是由 type 类实例化产生,type类中如何实现的创建类?类又是如何创建对象?

答:类中有一个属性 __metaclass__,其用来表示该类由 谁 来实例化创建,所以,我们可以为 __metaclass__ 设置一个type类的派生类,从而查看 类 创建的过程。

class MyType(type):
def __init__(self,*args,**kwargs):
print("Mytype __init__") def __call__(self, *args, **kwargs):
print("Mytype __call__")
obj = self.__new__(self)
self.__init__(obj,*args, **kwargs) def __new__(cls, *args, **kwargs):
print("Mytype __new__")
return type.__new__(cls, *args, **kwargs) class Foo(object,metaclass = MyType):
# __metaclass__ = MyType
def __init__(self,name):
self.name = name
print("Foo __init__") def __new__(cls, *args, **kwargs):
print("Foo __new__")
return object.__new__(cls) f = Foo("Alex") # 输出:
# Mytype __new__
# Mytype __init__
# Mytype __call__
# Foo __new__
# Foo __init__

类创建的过程

类的生成 调用 顺序依次是 __new__ --> __init__ --> __call__

metaclass 详解文章:http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python 得票最高那个答案写的非常好

Python3学习之路~7.2 类的特殊成员方法的更多相关文章

  1. Python3学习之路~6.6 类的继承

    Inheritance 继承 面向对象编程 (OOP) 语言的一个主要功能就是“继承”.继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展.通过继承创 ...

  2. Python3学习之路~0 目录

    目录 Python3学习之路~2.1 列表.元组操作 Python3学习之路~2.2 简单的购物车程序 Python3学习之路~2.3 字符串操作 Python3学习之路~2.4 字典操作 Pytho ...

  3. Python3学习之路~6.7 经典类和新式类的继承顺序

    在Python中,经典类(class Person:)和新式类(class Person(object):)的主要区别就是体现在多继承的顺序上. Python 2.x中默认都是经典类,只有显式继承了o ...

  4. Python3学习之路~8.5 SocketServer实现多并发

    前面几节我们写的socket都只能实现服务端与一个客户端通信,并不能实现服务端与多客户端同时通信.接下来我们就来学习一下如何实现服务端同时与多个客户端通信,即并发. Socket Server soc ...

  5. Python3 学习第五弹:类与面向对象

    对于面向对象总是要提到,万物皆对象.好似博大精深的感觉. 接下来一起看看python的面向对象的例子 创建一个对象 class Person: type = 'person' def __init__ ...

  6. Python3学习之路~8.6 开发一个支持多用户在线的FTP程序-代码实现

    作业: 开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp s ...

  7. Python3学习之路~7.5 异常处理

    1.异常基础 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! try: pass except Excepti ...

  8. Python3学习之路~8.2 socket简单实例 实现ssh 发送大量数据

    实例1: 利用socket模拟客户端和服务器端各自收发一次数据: #Author:Zheng Na # 客户端 import socket # 声明socket类型,同时生成socket连接对象 cl ...

  9. Python3学习之路~3.3 内置函数

    Python内置函数表: 内置参数详解:https://docs.python.org/3/library/functions.html?highlight=built#ascii 用法: #Auth ...

随机推荐

  1. python-argparse使用

    官方文档:https://docs.python.org/zh-cn/3.7/library/argparse.html?highlight=argparse#module-argparse argp ...

  2. python内置模块之-logging

    logging 模块主要用于写日志 logging模块主要有如下几个组件 Logger  Logger对象提供应用程序可直接使用的接口 Handler Handler发送日志到适当的目的地 Filte ...

  3. 将日志备份推送到s3存储上

    1.将日志备份推送到s3存储上 #!/bin/sh # 此脚本实现将/usr/local/netqin/boss/netqin/logs/BOSS_ContentServer/BOSS_AD_SDK ...

  4. xstream实现对象的序列化和反序列化(Java)

    概述 最新整理Java方面XML序列化和反序列化的常用工具类,找到了dom4j和xstream.dom4j相对小巧,很好的解读xml:但是对于对象的xml序列化和反序列化,我还是比较喜欢xsteam( ...

  5. HDU 5977 Garden of Eden

    题解: 路径统计比较容易想到点分治和dp dp的话是f[i][j]表示以i为根,取了i,颜色数状态为j的方案数 但是转移这里如果暴力转移就是$(2^k)^2$了 于是用FWT优化集合或 另外http: ...

  6. CSS/Xpath 选择器 第几个子节点/父节点/兄弟节点

    0.参考 1.初始化 In [325]: from scrapy import Selector In [326]: text=""" ...: <div> ...

  7. Django模型初识

    模型层(what.why.how) 模型的相关配置

  8. python可视化pyecharts

    python可视化pyecharts 简单介绍 pyecharts 是一个用于生成 Echarts 图表的类库.Echarts 是百度开源的一个数据可视化 JS 库.用 Echarts 生成的图可视化 ...

  9. js事件循环机制 (Event Loop)

    一.JavaScript是单线程单并发语言 什么是单线程 主程序只有一个线程,即同一时间片断内其只能执行单个任务. 为什么选择单线程? JavaScript的主要用途是与用户互动,以及操作DOM.这决 ...

  10. Understanding HBase and BigTable

    Hbase is a distributed data storage systems. A Bigtable is spare , distributed , persistent multidim ...