一、new()
当使用"类名( [实参])"创建实例对象时,Python解释器的主要处理过程包括两大步:
调用特殊方法__ new __ ()创建实例对象
首先会查找该类对象是否实现了特殊方法 __ new __(), 如果没有实现,则去其父类中依次查找,直到类对象object。
调用特殊方法 __ init __ ()对创建的实例对象进行初始化
__ new __ ( )返回的实例对象会作为实参被自动传递给__ init __ ()的第一个形参self。
getitem( )、setitem()、delitem()
对于自定义类对象的实例对象,在默认情况下,是不能像列表和字典那样使用中括号语法来进行操作数据的。
如果想让自定义类对象的实例对象可以像列表和字典那样,使用中括号语法来操作数据,必须在自定义类对象中实现以下特殊方法
- _ getitem_ (self, key)
当执行操作obj [key]时,会自动调用该特殊方法。 - _ setitem_ (self, key, value)
当执行操作obj [key] = value时, 会自动调用该特殊方法。 - __ delitem __ (self, key)
当执行操作del obj [key]时,会自动调用该特殊方法。
__ call __( ) 与 callable()
如果类对象中实现了特殊方法__ call __(),那么就可以像调用函数一样直接调用这个类对象的实例对象,从而会自动调用特殊方法 __ call __().
__ doc __ 与 __ dict __
调用内置函数dir得到的类对象的所有属性中,有一个特殊属性叫__doc__, 用于表示类对象的文档字符串。
一、类对象的文档字符串
- 与函数的文档字符串类似,位于类对象的第一行的字符串被称为类对象的文档字符串,通常用三个引号表示。
- 类对象的文档字符串是对类对象的功能的简要描述。
二、访问类对象的文档字符串
- 通过类对象的特殊属性__doc__ 可以访问类对象的文档字符串。
- 调用内置函数help()得到的帮助信息中会包含类对象的文档字符串。
对于指定的类对象或实例对象,可以访问特殊属性__dict__ 获得该类对象或实例对象所绑定的所有属性和方法的字典。其中,字典中的键为属性名或方法名。
特殊属性之 slots
Python是动态语言,所以,在创建对象之后,可以对其动态地绑定属性和方法。
如果想要对实例对象动态绑定的属性和方法的名称进行限制,可以在其对应的类对象中定义特殊属性__ slots__, 并给__slots__ 赋值一个所有元素都为字符串的列表或元组,这样,对实例对象动态绑定的属性和方法的名称就只能来自于__slots__ 中的元素。
默认情况下,访问实例对象的属性是通过访问该实例对象的特殊属性__dict__ 来实现的。例如:访问obj.x其实访问的是obj.dict [‘x’]
在类对象中定义了特殊属性__slots__后,其实例对象就不会在创建特殊属性__dict__ 了,而是为每个属性创建一个描述器,访问属性时就会直接调用这个描述器。调用描述器比访问__dict__ 要快,因此,在类对象中定义特殊属性__slots__ 可以提高属性的访问速度。
此外,在类对象中定义了特殊属性__slots__ 后, 由于其实例对象不再创建特殊属性__dict__ , 同时,特殊属性__dict__ 是一个字典,字典的本质是哈希表,是一种用空间换取时间的数据结构,因此,在类对象中定义特殊属性__ slots__ 可以减少内存消耗。
-
特殊属性__slots__只对其所在类对象的实例对象起作用,对其所在类对象的子类的実例实例对象是不起作用的。
-
如果子类也定义了特殊属性__slots__,那么子类的实例对象可以动态绑定的属性和方法的名称为子类的__slots__ 加上父类的__ slots__。
特殊方法之 __ len() __
内置函数len( )用于返回对象的长度。
内置函数len()的实参在默认情况下不能是自定义类对象的实例对象。
如果想让内置函数len( )的实参可以是自定义类对象的实例对象,必须在自定义类对象中实现特殊方法__len__ (), 这样,调用内置函数Len()时,在其内部会自动调用实参所对应类对象的特殊方法__len__().之所以内置函数len()的实参可以是上述内置类对象的实例对象,是因为上述的内置类对象中都实现了特殊方法__len__()。