Python类的基础--设计、使用

类是事物功能和属性的抽象 , 对象是类的实例化 。 就像人人都知道小汽车可以干什么什么的 , 但光想小汽车如何好是没有用的 , 得开车或坐才能感受到小汽车的好 。 人脑里的小汽车是抽象的 , 即类 , 而坐上的某辆车是小汽车的实例化 , 即对象 。 所以 , 如果一门语言提供了、支持面向对象编程的机制 , 那么首先得先设计程序所需要的类 , 然后再在程序里将这些类实例化产生对象 , 通过对象这个程序元素(和变量、函数等起着相同的作用 , 构成程序的基本元素) , 所以类的设计是面向对象编程是否有效、合理、成功的关键 。
Python类的基础--设计、使用文章插图
类类总的来说是专有数据用专用方法处理 , 即数据和处理数据方法的集合 , 故类的里有数据(属性)和函数(功能) , 且类里的数据必须用类里的方法来操作处理 。
类里的这些函数也有时又称方法、成员函数 , 如果方法或函数作用于类本身称之为类方法 , 如果方法作用于由类产生出的实例对象上 , 这些方法称之为实例对象的方法 。 类里的数据称为属性(类属性和实例对象属性)、成员变量 。
类不能无源而生 , 需有自己的父类 , 而object这个类是Python下的根类(base class) , 也就是说用户自己的类可以继承object 这个类作为自己(父)类的起点 , 类的父类需要用圆括号括起来放在类名字的后边 。
定义类基于上边讲述 , 定义一个常规的类格式如下:
class 类名字(父类序列):类的成员变量 = 初值def __init__(self, 形参序列):self.实例对象的成员变量名 = 初值其他语句def 其他实例对象函数名(self,形参序列):语句@classmethonddef 类的成员函数名(cls,形参序列):cls.类的成员变量名 = 初值语句@staticmethonddef 函数名(形参序列):语句类的语法格式里出现了一些奇奇怪怪的符号 , 下面一一解释一下 。class和定义函数的def一样是Python里的关键字 , 用于定义一个类的标识符 。
位于class下和_ _init_ _函数间声明的变量是类的变量 , 可被类或类的对象共有 。
__init__可以成为类的实例对象的构造函数 , 每次通过类创建一个该类的对象是调用此函数 , 所以其下的以sefl.前缀的变量是每个创建好了的实例(化)对象的所独有的 。 换句话说 , 有多少个类的对象内存里就有多少份这个实例对象变量存在 。 就像生产了多少小汽车就有多少个方向盘似的 。
self代表运行时的类的实例对象本身 , 一般在类的内部设计时出现 , 在程序里使用对象编程时不用self 。 在实例对象的成员函数里以self.前缀的变量是实例对象的成员变量 , 没有self.的变量是本方法函数的局部变量 。
cls和self出现在构造和实例对象函数的第一个参数位置上一样 , cls关键字出现在类的方法函数里 , 区分于对象函数和变量时会用到 。 在类的函数里以cls.前缀的变量也是类的成员变量 , 没有这个前缀的是局部变量 。
@classmethon这个关键字是修饰器 , 修饰也是说下面的函数是类的方法函数而不是类的对象的方法函数 。
@staticmethod这个也是修饰器 , 说明接下来的函数是一个静态函数 , 和实例对象的成员函数、类函数的区别主要在第一个形参 , 既无self又无cls 。 可以被类或对象直接调用 。 差不多解释完了 , 下面来看一个具体的类的实例程序 。
定义一个类的示例下面创建一个Horse类 , 类里除了有实例对象的方法函数、类方法函数和静态方法函数 , 还有实例对象成员变量和类变量 。
# coding:utf-8class Horse(object):variety = "大宛马"def __init__(self, name = "green", height = 0.5, length = 1.3, sex = "male"):self.name = nameself.height = heightself.length = lengthself.sex = sexprint "A baby horse is born called", self.name@classmethoddef pp(cls):print cls.variety, Horse.variety, cls.address@classmethoddef print_variety(cls):cls.address = "xi'an"print cls.variety, Horse.variety, cls.addressHorse.pp()def print_info(self):print self.name, self.height, self.length, self.sex, Horse.variety#,Horse.addressHorse.print_variety()@staticmethoddef print_ci(x, y):print x, y1).出现在class下一行的variety是类Horse的变量 , 是类变量 , 可以通过Horse.variety在类的内部或者外部任何地方被访问 。
2).__init__函数是Horse类的实例对象的构造函数 , 每次创建一个Horse类的实例对象时 , 这个函数均会被调用执行 , 其下以self.开始的变量是每个实例对象的成员变量 , 即标的这个实例对象的属性、特征用的 。
3). 用修饰器@classmethod修饰的两个函数pp、print_variety , 是类Horse的类函数 , 类函数只可通过类或cls使用 。 在pp这个函数里可以看出一点 , 在类的内部类变量的使用需前缀类名.或cls. 。