类
- 类名通常第一个字母大写
- Python没有C++类似的构造函数和析构函数,Python存在和构造函数相似的东西,
__init__
方法。 - Python中类的基类只是简单地列在类名后面的小括号里,不像Java中有一个特殊的extends关键字。
- Python支持多重继承,在小括号中以逗号分隔
__init__
与self
__init__
在类的实例创建后被立即调用,它和类的构造函数是有区别的。因为,在调用__init__
前,对象已经被构造出来了,您已经有了一个对类的新实例的有效引用self。- 每个类方法的第一个参数都是指向类的当前实例的引用(包括
__init__
),这个参数被称为self。 - self扮演着C++、Java中的this的角色。但是self不是保留字,是一种命名习惯。
- 当从子类中调用父类的一个方法时,必须包括self参数。但从类的外部调用类方法时,不需要对self参数指定值。
__init__
方法其实是可选的,但一旦定义了,就必须记得显示调用父类的__init__
方法(如果有的话)。
类的实例化与垃圾回收
__class__
,在每个类的实例中都有一个这样的内置属性,它是对象的类。- 一个类的所有实例共享相同的doc string。
- 垃圾收集的方式,引用计数
- 待更
- -
函数重载和方法覆盖
- Java支持通过参数列表的重载,也就是一个类可以有同名的多个方法,但这些方法或者是参数个数不同,或者是参数类型不同。
- 其它语言(如PL/SQL)支持通过参数名的重载,也就是一个类可以有重名的多个方法,这些方法有相同类型,相同个数的参数,但是参数名不同。
- Python不支持任何形式的函数重载。一个
__init__
方法就是一个方法,不管有什么参数,每个类只能有一个__init__
方法。并且子类的__init__
方法总是覆盖父类的__init__
方法,甚至子类可以用不同的参数列表来定义它。
Python的作者Guido是这样解释方法覆盖的:“子类可以覆盖父类中的方法,因为方法没有特殊的优先级设置,父类中的一个方法来调用同类的另一方法时,可能其实调用到的却是一个子类中覆盖父类同名方法的方法。”
- copy模块中的copy函数可以拷贝任何python对象。
专用类
专用方法
- 形式:
__something__
- 在特殊情况下或当使用特别语法时由Python替你调用的,而不是在代码中直接调用。
- 例如:
In: li = {1:1}
In: li[2] = 2
In: li
Out: {1: 1, 2: 2}
In: li.__setitem__(2,3)
In: li
Out:{1: 1, 2: 2, 3: 3}
In: li[1]
Out: 1
In: li.__getitem__(2)
Out: 2
- 您用正确的语法设置值和返回值时,Python帮您调用
__setitem__
和__getitem__
方法。 __repr__
是一个专用方法,当调用repr(instance)时被调用,repr函数是一个内置函数,它返回一个对象的字符串表示。__cmp__
是一个专用方法,用于比较类实例。你可以使用==
来比较你的类,Python会替你调用该专用方法——len__
再调用len(instance)时被调用,len是一个内置函数,可以返回一个对象的长度,它可以用于任何被认为利用有长度的对象。
判断对象的相等性
- 在Java中,通过使用
str1 == str2
可以确定两个字符串变量是否指向同一块物理内存位置。这叫做对象同一性。 - 在Python中,使用
str1 is str2
来判断是否指向同一块物理内存位置。 - 在Java中,通过
str1.equals(str2)
来判断两个字符串值是否相等 - 在Python中,使用
str1 == str2
来判断值的相等性
专用方法的意义
- 专用方法意味着任何类可以像字典一样保存键-值对,只要定义
__setitem__
方法。任何类可以表现得像一个序列,只要定义__getitem__
方法。任何定义了__cmp__
方法的类可以用==
进行比较。任何定义了__len__
方法的类都可以拥有类似长度的东西。 __call__
方法允许一个类表现得像一个函数,允许你直接调用一个类实例。
类属性
- Java中的静态变量(有static关键字)就等同于Python的类属性。
- Python中,类属性定义在类定义之后,数据属性定义在
__init__
方法中。 - 类属性可以作为类级别的常量来使用,但它们不是真正的常量,您可以修改它们。
在Python中没有常量,如果你试图努力的话什么都可以改变。这一点满足Python的核心原则之一:坏的行为应该被克服而不是被取缔。
私有函数
- Python中的私有属性和私有类方法以两个下划线开始(但不是结束),它是私有的;其它所有的都是公有的。
- Python中的专有方法和内置属性(例如
__doc__
和__setitem__
),都遵守一个标准的命名习惯,开始和结束都有两个下划线。专有方法通常不被直接调用,而是通过在一个类上使用正确的语法来使Python调用。 - Python不像C++,有protect的概念,Python中的类方法,要不是private的(只能在自己的类中使用),要不是public的(任何地方都可以使用),没有protect(即用在它们自己的类和子类中)。