1.通过在自定义类中嵌入内置类型,类似委托;这样自定义类就可以实现内置类型的接口。
这些接口在内部通过操作嵌入的内置类型来实现。
这是一种扩展内置类型的方式
2.通过子类扩展内置类型:所有内置类型都可以直接创建子类,如list、str、dict、tuple、set等
- 内置类型的子类实例可以用于内置类型对象能够出现的任何地方
3.在Python3中所有的类都是新式类。
Python2.2之前的类不是新式类
-
所有的类都是从
object内置类派生而来 -
type(obj)返回对象实例所属的类对象对于实例对象的
type(obj)返回值也是obj.__class__ -
type(classname)返回"type",因为所有class对象都是type的实例 -
由于所有
class均直接或者间接地派生自object类,因此每个实例对象都是object类的实例 -
object是type类的实例,但是同时type又派生自object
4.Python3中的类有一个.__slots__属性,它是一个字符串列表。这个列表限定了类的实例对象的合法属性名。如果给实例赋了一个.__slots__列表之外的属性名会引发异常
-
虽然有了
.__slots__列表,但是实例对象的属性还是必须先赋值才存在 -
当有
.__slots__列表存在时,默认会删除.__dict__属性,而getattr(),setattr()以及dir()等函数均使用.__slots__属性,因此仍旧可以正常工作- 可以在
.__slots__列表中添加.__dict__字符串, 因此对于使用.__dict__的地方均能正常工作
- 可以在
-
.__slots__属性的使用可以优化内存和读取速度 -
在继承中:
5.Python3的property机制:
property是一个对象,通过它给类变量名赋值。
class A:
age=property(getMethod,setMethod,delMethod,docMethod)
# 或者直接指定docstring
def getMethod(self):
pass
def setMethod(self,val):
pass
def delMethod(self):
pass
def docMethod(self):
...
# return a string
-
property优点:代码简单,运行速度更快;缺点:当类编写时可能还无法确定property名字,因此无法提供动态的接口 -
如果
property的docstring或者docMethod为None,则Python使用getMethod的docstring。
一个添加了语法糖的方案为:
class A:
def __init__(self):
self._x = None
@property #定义了一个property get函数,必选
def x(self): # property name 就是 get函数的函数名
"""I'm the 'x' property."""
return self._x
@x.setter #定义了一个property set函数,可选
def x(self, value):
self._x = value
@x.deleter #定义了一个property del函数,可选
def x(self):
del self._x
6.Python类中有两种特殊的方法:staticmethod方法和classmethod方法
staticmethod方法:当以实例对象调用staticmethod方法时,Python并不会将实例对象传入作为参数;而普通的实例方法,通过实例对象调用时,Python将实例对象作为第一个参数传入-
定义
staticmethod方法:class A: @staticmethod #定义一个staticmethod def func(*args,**kwargs) pass
-
classmethod方法:当以实例对象或者类对象调用classmethod方法时,Python将类对象(如果是实例对象调用,则提取该实例所属的类对象)传入函数的第一个参数cls中-
定义
classmethod方法:class A: @classmethod #classmethod def func(cls,*args,**kwargs) pass
-
总结一下,类中可以定义四种方法:
-
普通方法:方法就是类对象的一个属性,执行常规函数调用语义
classname.method(args) -
实例方法:传入一个实例作为方法的第一个实参。调用时可以:
obj.method(args):通过实例调用classname.method(obj,args):通过类调用
-
staticmethod方法:*obj.method(args)通过实例调用时,执行的是classname.method(args)语义 -
classmethod方法:*obj.method(args)执行的是classname.method(classname,args)语义
7.类的实例方法中,用哪个实例调用的该方法,self就是指向那个实例对象
类的classmethod方法中,用哪个类调用该方法,cls就指向那个类对象
8.类对象与实例对象都是可变对象,可以给类属性、实例属性进行赋值,这就是原地修改。这种行为会影响对它的多处引用
任何在类层次所作的修改都会反映到所有实例对象中
9.若类的某个属性是可变对象(如列表、字典),则对它的修改会立即影响所有的实例对象
10.多重继承中,超类在class语句首行内的顺序很重要。Python搜索继承树时总是根据超类的顺序,从左到右搜索超类。