类内置

方法:
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的虚拟子类
posted @ 2018-02-02 21:34  blog_hfg  阅读(113)  评论(0)    收藏  举报