首先我先问一个问题,我国有多少个省?
神回复:23 个 为什么是23个,而不是一个呢? 为什么每个省下有那么多个市,而不是一个呢? 那么我们分析一下:如果我们国家只有一个省,那么我们国家最大的省长就是习大大, 他下面也没有分省长,那么意味着,我们的直属领导就是习大大,我们全部归他直接管理, 也意味着,习大大要管理中国14亿人口,那这样不好吗? 如果这样,管理起来是不是很不方便? 对于程序来讲,如果你写一个程序,程序写大了之后,如果不做分片管理,可能会出现不可控的现象, 换言之,对于一个省,一个人能管理得那么多?管理不过来吧? 所以采取了一种方式,分为几十个省。 每个省长都认识习大大,而为什么每个省下的每个市长认识习大大,而习大大不认识这些市长? 假如说,省长是习大大的下一代(son),那么市长就是习大大的下下代(grandson),因为 每个省长自己有太多的下一代(son),意味着习大大有太多的下下代(grandson),所以 习大大认不过来。虽然习大大不知道这些市长是谁,但是他肯定知道这些市长是属于他管理的 ,他们之间总有一种联系,一种归属联系,谁属于谁。 又比如说,长沙市,长沙市属于湖南,湖南属于中国,比如长沙和北京,它们之间是不是有 共同性,都属于中国,但是他们也有不同,地理位置不同,人口数量不同,方言不同。也就是说, 他们有相同性,也有不同性。 放在计算机的世界里,通过面向对象编程,可以实现程序之间有一些共同性,也可以衍生 出一些不同性。
比如说,猫、狗、熊猫、狮子 等是不是都是动物,那么我们是不是可以把它们归为一类, 都是动物,即动物 包括 猫 狗 熊猫 狮子 等.... 人也可以分类:男人、女人 或者 好人、坏人
从上面的例子,不难知道, 人、动物、 ... 就是一个类
对象即类的实体,一个叫老六很漂亮的女人(这就是一个对象)
人会走、会跑、会思考 狗会叫、会啃骨头、会咬人 (定义一个类的各个功能,方法)
人都有手有脚(继承它的父母)
人不能引用狮子的特性,比如4条腿走路
一个叫的功能,可能低吼、可能大声叫
简化复杂的现实的问题途径,可以给任何问题找到恰当的类定义 比如:空气 ,看不见,摸不着,我们也可以给它一个类,“气体”
类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义:
class className: block
注意类名后面有个冒号,在block块里面就可以定义属性和方法了。当一个类定义完之后,就产生了一个类对象。类对象支持两种操作:引用和实例化。引用操作是通过类对象去调用类中的属性或者方法,而实例化是产生出一个类对象的实例,称作实例对象。比如定义了一个People类:
class People: name = 'allen' #定义了一个属性 def MyName(self): #函数,在类中就是一个方法 print self.name
People类定义完了之后就产生了一个全局的类对象,可以通过类对象来访问类中的属性和方法了。当通过People.name来访问时,People.name中的People称为类对象,当然还可以进行实例化操作,P1= People(),这样就产生了一个People的实例对象P1,此时也可以通过实例对象P1来访问属性或者方法了(P1.name)
注意:上面的例子中,name是一个属性,函数Myname()是一个方法,一般在类里面定义的函数与类 对象或者实例对象绑定了,所以称作为方法;而在类外定义的函数一般没有同对象进行绑定,就称为函数。
在类中,我们可以定义一些属性:
class People: name = 'allen' age = 25 P1 = People() #实例化了一个对象P1 print P1.name #然后就可以通过P1来读取属性了 print P1.age # name , age 是类的公有属性 # 可以直接在类外通过对象名访问,私有属性,需在前面加2个下划线“__”即可。
class People: __name = 'allen' __age = 25 P1 = People() print P1.__name #访问类的私有属性 print P1.__age #访问类的私有属性 # 以上访问会报错
执行结果报错如下
Allen:$ python test1.py Traceback (most recent call last): File "test1.py", line 9, in <module> print P1.__name AttributeError: People instance has no attribute '__name' 提示找不到该属性,因为私有属性是不能够在类外通过对象名来进行访问的。
在类中可以根据需要定义一些方法,定义方法采用def关键字,在类中定义的方法至少会有一个参数,,一般以名为'self'的变量作为该参数(用其他名称也可以),而且需要作为第一个参数。
class People: __name = 'allen' __age = 25 def MyName(self): #self 作为参数 return self.__name def MyAge(self): return self.__age P1 = People() print "my name is: %s, age is: %s" % (P1.MyName(),P1.MyAge()) self,可以把它当做指针理解,就是对象自身的意思,在用某个对象调用该方法时,就将该对象 作为第一个参数传递给self。
执行结果如下:
Allen:$ python test1.py my name is: allen, age is: 25
在Python中有一些内置的方法,这些方法一般是以 2个下划线开始然后以2个下划线结束。类中最常用的就是构造方法和析构方法。
我们一般看到的比较多的 __init__(self,name,age,...) 就是构造方法 构造方法在生成对象时调用,可以用来进行一些初始化操作,不需要显示去调用, 系统会默认去执行。构造方法支持重载,如果用户自己没有重新定义构造方法, 系统就自动执行默认的构造方法。 而__del__(self) 也就是析构方法,在释放对象时调用,支持重载,可以在里面进行 一些释放资源的操作,不需要显示调用。
顾名思义,类属性就是类对象所拥有的属性(我们上面觉得例子就是类属性),它被所有类对象的实例对象所共有,在内存中只存在一个副本,对于类的共有属性,在类外可以通过类对象和实例对象访问。
关于类的属性的访问,请看以下例子
class People: name1 = 'allen' #类的共有属性 __name2 = 'yyh' #类的私有属性 P1 = People() #P1,实例化后的对象 print P1.name1 #正确 print People.name1 #正确 print P1.__name2 #错误,不能在类外通过实例对象访问类的私有属性 print People.__name2 #错误,不能在类外通过类对象访问类的私有属性
实例属性是可以通过赋值定义的:
class People: name = 'allen' P1 = People() P1.age = 25 #给P1对象添加一个实例属性age,赋值为25 print P1.name #正确 print P1.age #正确 print People.name #正确 print People.age #错误
在类外对类对象People进行实例化产生P1,然后P1.age = 25 相当于 P1 添加了一个实例属性
age,并且赋值为25。这个实例属性是实例对象P1所特有的,但是,类对象People并没有拥有它
所以不能通过类对象来访问这个age属性,当然还可以在实例化对象的时候给age赋值。
class People: name = 'allen' def __init__(self,age): #是内置的构造方法,在实例化对象时自动调用 self.age = age P1 = People(25) #实例化对象,并赋值 print P1.name #正确 print P1.age #正确 print People.name #正确 print People.age #错误
未完待续...
(如果你觉得还OK,别忘记推荐呦~)