深入理解Python(五)

  • 类名通常第一个字母大写
  • 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(即用在它们自己的类和子类中)。

猜你喜欢

转载自blog.csdn.net/sjz_hahalala479/article/details/71374929