Python类中的特殊成员
Python Version: 3.5+
init
构造方法,每个对象被实例化出来的时候都将首先去执行init方法
1 | class A: |
class A:
def del(self):
print(“在对象销毁之前会执行del“)
1 | __doc__ |
class A:
“””我是A类的描述信息”””
pass
1 | __module__ |
class A:
“””我是A类的描述信息”””
pass
1 | ``` |
class
表示当前操作的对象的类是什么
1 | class A: |
call
类名后面加括号表示创建一个对象;如果在对象后面加括号,就需要使用call方法了,如果不定义这个方法,在执行对象()的时候就会报错
1 | class A: |
创建对象的时候首先执行init,在对象被调用的时候执行call
也可以在一行执行
1 | a = A()() |
str
print对象的时候显示的内容
1 | class A: |
在没有定义str的情况下,输出的是a对象的内存地址信息
1 | class A: |
str的应用实例
1 | class B: |
str类型转换
1 | class B: |
str(b)和print()都会自动去调用b对象中的str方法
dict
对象的dict
在对象中默认已经有dict,不需要自定义。该方法用来获取对象中所有封装的对象
1 | class B: |
类的dict
列出类中所有可以调用的方法
1 | class B: |
add
当执行一个对象 + 一个对象的时候,就会自动去执行这个方法
注意,执行的是第一个对象的add方法
1 | class A: |
getitem setitem delitem
用于索引操作,如字典。以上分别表示获取、设置、删除数据
1 | d = {"k": "v"} |
上面的代码展示了一个字典对象的取值、赋值和删除的操作。在自定义的类中,也可以实现类似于字典这样的操作
对象后面加小括号是执行call方法,那么对象后面加中括号又是怎样处理的呢?
使用key进行的操作
取值
1 | class B: |
赋值
1 | class B: |
你要为name重新赋值为lr
删除
1 | class B: |
在web开发中,自定义session框架的时候会用到
使用下标进行的操作
使用下标和使用key的形式类似,使用key, item接收的是一个字符串,使用下标, item接收的是一个int类型的数字,可以在方法体内通过判断传递过来数据的数据类型来进行对应的操作
使用切片的操作
1 | l = [1,2,3,4,5,6,7,8,9] |
在Python2.x中使用getslice setslice delslice来实现切片的操作,但是Python3.x中被遗弃,所有切片的功能都集中在了getitem setitem delitem中
1 | class B: |
item为slice时表示调用了切片的操作
1 | class B: |
相对应的,取值可以通过判断item的类型做相应的操作,赋值和删除也可以通过判断key的类型来进行想对应的切片操作
1 | class B: |
iter
一个自定义类实例化的对象,默认是不可迭代的,在类中使用iter方法后,对象就变成了可迭代对象。当对象被迭代时,会自动调用iter方法
1 | class A: |
1 | class A: |
1 | class A: |
先去a对象中找到iter方法执行,并拿到返回值进行迭代
new metaclass
1 | class A(object): |
上述代码中,a 是通过 A 类实例化的对象,其实,不仅 a 是一个对象,A类本身也是一个对象,因为在Python中一切事物都是对象。
如果按照一切事物都是对象的理论:a对象是通过执行A类的构造方法创建,那么A类对象应该也是通过执行某个类的构造方法创建。
1 | print type(a) # 输出:<class '__main__.A'> 表示,a对象由A类创建 |
所以,a对象是A类的一个实例,A类对象是type类的一个实例,即:A类对象是通过type类的构造方法创建
那么,创建类就可以有两种方式:
- 普通方式def func(self):
1
2
3
4
5
6class A(object):
def func(self):
print("ps")
```
- 特殊方式(type类的构造函数)
print(“ps”)
A = type(‘A’,(object,), {‘func’: func})
#type第一个参数:类名
#type第二个参数:当前类的基类
#type第三个参数:类的成员
1 | –> 类是由type类实例化产生 |
class MyType(type):
def __init__(self, what, bases=None, dict=None):
super(MyType, self).__init__(what, bases, dict)
def __call__(self, *args, **kwargs):
obj = self.__new__(self, *args, **kwargs)
self.__init__(obj)
class A(object):
__metaclass__ = MyType
def __init__(self, name):
self.name = name
def __new__(cls, *args, **kwargs):
return object.__new__(cls, *args, **kwargs)
第一阶段:解释器从上到下执行代码创建A类
第二阶段:通过A类创建a对象
a = A()
[原文地址](https://docs.lvrui.io/2016/07/03/Python%E7%B1%BB%E4%B8%AD%E7%9A%84%E7%89%B9%E6%AE%8A%E6%88%90%E5%91%98/)