Python类: 1. 如果一类自己或基类中指定了metaclass,那么该类就是由metaclass指定的type或mytype创建。 2. metaclass作用是指定当前类由谁来创建。 - 源码 如果类以基类中未指定metaclass: - __new__ - __init__ 如果类以基类中指定metaclass: - 创建类 MyType.__init__ 1.步生成类 - 创建对象 MyType.__call__ 2.步创建对象 - __new__ 3.生成对象 - __init__ 3. 类创建 a.- class Foo(object):pass b.- Foo = type('Foo',(object,),{静态字段或者方法}) c.- 执行自定义的mytype class Foo(metaclass=MyType): # __metaclass__ = MyType --> python2 pass 4. 谈谈你对面向对象的认识? 父类/子类 <--> 基类/派生类 - 基础:谈面向对象就要从他的三大特性开始说起,如:封装、继承、多态。 1.封装: a.功能封装,相同的功能封装到一个类 b.数据封装,面向同一个类别(比如人),不同的数据也可以封装进类中 2.继承 a.有共同方法时,可把此方法封装到父类,避免重复编写(子类继承即可) 3.多态(鸭子模型):Python原生支持多态 a.对于参数来说可以传入任何类型的对象,只要保证有想要的相同方法(send)即可。 def (*args): args.send() 5. 进阶: __init__,初始化 __new__,创建对象 __call__,对象() __getattr__,对象.xx __setattr__ __delattr__ __setitem__,对象['xx'] __getitem__ __delitem__ __mro__,查找成员顺序 __enter__起始 <--> __exit__结束 --》with语句 __str__ 返回字符串 __repr__ 返回整洁形式 __iter__,迭代 __dict__, 返回字典数据类型 __add__,一个对象加一个对象 6. 令你印象深刻的事(好神奇)。 obj._Foo__name 可以获取当前类中私有属性。生成实例对象,调用_类__name 7. 类的约束: - 继承+抛出异常 (*) class Base(object): def send(self): raise NotImplementedError('子类中必须实现send方法') import abc class Base(metaclass=abc.ABCMeta): @abc.abstractmethod def send(self):pass ('子类中必须实现send方法') 8. classmethod,staticmethod,property classmethod:类方法,将类的函数转换成类方法,函数上装饰@classmethod会将函数的自动传值参数改成cls。 staticmethod:静态方法,此方法相当于给类扩展一个功能,将类内的函数实例化,给类或对象使用,此时类内的函数就是普通函数,不管是类还是实例化的对象都可以使用。 property:实例化,类的实例化就会产生一个实例(对象),可以理解为类把虚拟的东西实例化,得到具体存在的值。 9. 经典类、新式类 经典类遵循:深度优先,python2中 新式类遵循:广度优先,Python3中