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中