所有的新式类必须继承至少一个父类,参数bases可以是一个(单继承)或多个(多重继承)用于继承的父类。


object是“所有类之母”。如果你的类没有继承任何其他父类,object将作为默认的父类。它位于所有类继承结构的最上层。


如果你没有指定一个父类,或者如果所有子类化的基本类没有父类,你就这样创建了一个经典类。


创建一个实例的过程称作实例化。


你不需要在构造器中,或其他任何地方为它们预先声明或者赋值。


调用一个方法的最终途径必须是这样的:

(1)定义类(和方法)

(2)创建一个实例

(3)最后一步,用这个实例调用方法


self参数代表实例对象本身。


你不需要自己传递self进来,因为它是自动传入的。


python把self作为第一个参数传递进来。


在python中,__init__()实际上不是一个构造器。

python创建实例后,在实例化过程中,调用__init__()方法,当一个类被实例化时,就可以定义额外的行为,去执行某些特定的任务或设置。


实例化调用时,它会自动调用__init__()。self把实例对象自动传入__init__()。


如果不存在默认的参数,那么传给__init__()的两个参数在实例化时是必须的。


靠继承来进行子类化是创建和定制新类类型的一种方式。


python中,当一个类被派生出来,子类就继承了基类的属性。


类名通常由大写字母打头。


在python中,所有的类属性都是公开的,但名字可能被“混淆”了,以阻止未经授权的访问,但仅此而已,再也没有其他预防措施了。


合成扩充了对类的描述,使得多个不同的类合成为一个大的类。


派生描述了子类的创建,新类保留已存类类型中所有需要的数据和行为,但允许修改或者其他的自定义操作,都不会修改原类的定义。


泛化表示所有子类与其父类及祖先类有一样的特点。


多态的概念指出了对象如何通过他们共同的属性和动作来操作及访问,而不需考虑他们具体的类。


自省表示如果传一个对象给你,你可以查出它有什么能力。


类和函数最大的不同在于你运行函数,而类会创建一个对象。


尽管类是对象,但正被定义时,他们还不是对象的实现。


类还允许派生。你可以创建一个子类,它也是类,而且继续了父类所有的特征和属性。


类通常在一个模块的顶层进行定义,以便类实例能够在类所定义的源代码文件中的任何地方被创建。


声明与定义类没有什么区别,因为他们是同时进行的。


通常,python中所有方法都有一个限制:在调用前,需要创建一个实例。


静态成员通常仅用来跟踪与类相关的值。大多数情况下,你会考虑用实例属性,而不是类属性。


python严格要求,没有实例,方法是不能被调用的。在此,方法必须绑定到一个实例才能直接被调用。


要知道一个类有哪些属性,有两种方法:

①使用dir()内建函数:返回一个名字列表

②访问类的字典属性__dict__:返回一个字典


文档字符串不会被派生类继承,也就是说派生类必须含有他们自己的文档字符串。


python支持模块间的类继承。


类C的全名是“__main__.C”


如果说类是一种数据结构定义类型,那么实例则声明了一个这种类型的变量。换言之,实例是有生命的类。


当你定义一个类时,并没有创建一个新的类型,而是仅仅一个类对象。


当类被调用,实例化的第一步是创建实例对象。一旦对象创建了,python检查是否实现了__init__()方法。默认情况下,如果没有定义(或覆盖)特殊方法__init__(),对实例不会施加任何特别的操作。


__new__()会调用父类的__new__()来创建对象。__new__()必须返回一个合法的实例。__new__()和__init__()在类创建时,都传入了相同参数。


解构器只能被调用一次,一旦引用计数为0,则对象就被清除了。


python能够在“运行时”创建实例属性。python不仅是动态类型,而且在运行时,允许这些对象属性的动态创建。


属性在条件语句中创建,如果该条件语句块并未被执行,属性也就不存在,而你在后面的代码中试着去访问这些属性,就会有错误发生。


默认参数应当是不变的对象。


实例有个__dict__()的特殊属性,它是实例属性构成的一个字典。


你可以采用类来访问类属性,如果实例没有同名的属性的话,你也可以用实例来访问。


使用实例属性来试着修改类属性是很危险的。修改类属性需要使用类名,而不是实例名。


方法仅仅是类内部定义的函数。方法只有在其所属的类拥有实例时,才能被调用。


任何一个方法定义中的第一个参数都是变量self,它表示调用此方法的实例对象。


当你还没有一个实例并且需要调用一个非绑定方法的时候你必须传递self参数。


一个类被定义后,目标就是要把它当成一个模块来使用,并把这些对象嵌入到你的代码中去,同其他数据类型及逻辑执行流混合使用。


如果你在子类中覆盖了__init__(),子类被实例化时,基类的__init__()就不会被自动调用。


使用super()时,不需要明确给出任何基类名字。也就是说不需要明确提供父类。


我们是通过调用父类的构造器来创建真实的对象的,float.__new__()。注意,所有的__new__()方法都是类方法,我们要显式地传入类作为第一个参数。