类内置
方法:
def init(self):#类初始化函数
def call(self):#类实例调用函数,没有该函数的话类实例是不可调用的,可以把实例对象用类似函数的形式表示,进一步模糊了函数和对象之间的概念
def repr(self):#print(类实例)会先调用def str(self),若无该方法,则调用__repr__(self)方法;print(repr(类实例)),则调用__repr__(self)方法
def new(self):#类创建之前调用的方法,是用来创建对象并返回之的方法,而__init__只是用来将传入的参数初始化给对象
init,与new方法差异:http://python.jobbole.com/86506/
属性:
self.init(x=1,y=1)#初始化变量
self.dict#类成员变量构成的字典
self.class#查看所属类,指向类
self.iter#该方法返回一个迭代器对象
self.next#迭代器方法
__slots__的目的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使用__slots__也能节省内存
slots={'name','gender','score'}
sys.modules#查看python内置模块
cls:类对象
@property装饰器就是负责把一个方法变成属性调用的
class Student(object):
@property
def birth(self):
return self._birth
@birth.setter
def birth(self, value):
self._birth = value
@property
def age(self):
return 2014 - self._birth
上面的birth是可读写属性,而age就是一个只读属性且不可被改变,如Student().age=10是错误的,因为age可以根据birth和当前时间计算出来
abc模块
Python本身不提供抽象类和接口机制,要想实现抽象类,可以借助abc模块。ABC是Abstract Base Class的缩写。
抽象基类的使用:
1:直接继承
直接继承抽象基类的子类就没有这么灵活,抽象基类中可以声明”抽象方法“和“抽象属性”,只有完全覆写(实现)了抽象基类中的“抽象”内容后,才能被实例化,而虚拟子类则不受此影响。
2:虚拟子类
将其他的类”注册“到抽象基类下当虚拟子类(调用register方法),虚拟子类的好处是你实现的第三方子类不需要直接继承自基类,可以实现抽象基类中的部分API接口,也可以根本不实现,但是issubclass(), issubinstance()进行判断时仍然返回真值。
class BaseClass(ABC):
@abc.abstractmethod
def func_a(self, data):
"""
an abstract method need to be implemented
"""
@abc.abstractmethod
def func_b(self, data):
"""
another abstract method need to be implemented
"""
class SubclassImpl(BaseClass):
def func_a(self, data):
print("Overriding func_a, " + str(data))
@staticmethod
def func_d(self, data):
print(type(self) + str(data))
class RegisteredImpl(object):
@staticmethod
def func_c(data):
print("Method in third-party class, " + str(data))
BaseClass.register(RegisteredImpl)#将RegisteredImpl注册为BaseClass的虚拟子类

浙公网安备 33010602011771号