类与继承
类
注意
类名后面跟着小括号,这与调用函数是一样的,所以在Python中,类名约定用大写字母开头,函数用小写字母开头,这样更容易区分。另外赋值操作并不是必需的,但如果没有把创建好的实例对象赋值给一个变量,那这个对象就没办法使用,因为没有任何引用指向这个实例,最终会被Python的垃圾收集机制自动回收。
self
Python的self其实就相当于C++的this指针。
魔法方法
通常把__ init__ ()方法称为构造方法,__ init__ 方法的魔力体现在 只要实例化一个对象,这个方法就会在对象被创建时自动调用(在C++里也可以看到类似的东西,叫"构造函数”)。其实,实例化对象时是可以传入参数的,这些参数会自动传入__ _init__ _0方法中,可以通过重写这个方法来自定义对象的初始化操作。
私有化
在Python中定义私有变量只需要在变量名或函数名前加上“_” 两个下画线,那么这个函数或变量就会成为私有的了:Python目前的私有机制其实是伪私有,Python的类是没有权限控制的,所有变量都是可以被外部调用的。
继承
语法:
class 类名 (被继承的类) :
重写:
需要注意的是,如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性:
重写构造方法:
重写__ _init__ 方法的时候先调用基类Fish的__ _init__ 方法。 下面介绍两种可以实现的技术:
调用未绑定的父类方法。
这里需要注意的是,这个self并不是父类的实例对象,而是子类实例对象,所以,这里说的未绑定是指并不需要绑定父类的实例对象,使用子类的实例对象代替或使用super函数。
class 类名 (被继承的类) : def __init__(self): 被继承的类 .__init__(self) 其他属性
使用super函数。
class 类名 (被继承的类) : def __init__(self): super().__init__(self) 其他属性
python支持多重继承
class 类名 (父1, 父2 ,父3,。。。)
但多重继承很容易导致代码混乱,所以当不确定是否必须使用多重继承的时候,请尽量避免使用它,因为有些时候会出现不可预见的BUG。
组合
假设已有乌龟和鱼类,要求定义一个类,水池,要有乌龟和鱼
在Python里其实很简单,直接把需要的类放进去实例化就可以了,这就叫组合:
例:
class Turtle: def __init__ (self,x) : self .num = xclass Fish: def __init__(self,x) : self.num = xclass Pool : def __init__(self, X, y) : self.turtle=Turtle(x) self.fish=Fish(y)
注意事项
如果属性的名字与方法名相同,属性会覆盖方法:
定义注意
类的定义要“少吃多餐”,不要试图在一个类里边定义出所有能想到的特性和方法,应该利用继承和组合机制来进行扩展。用不同的词性命名,如属性名用名词、方法名用动词,并使用骆驼命名法。骆驼式命名法(CamelCase)又称驼峰命名法,是电脑程式编写时的一套命名规则(惯例)。正如它的名称CamelCase所表示的那样,是指混合使用大小写字母来构成变量和函数的名字,程序员为了自己的代码能更容易在同行之间交流,所以多采取统--的可读性比较好的命名方式。