python 类的初识
Python作为高级语言,也是一门面向对象的语言。面向对象实现的基础就是类(Class)。今天来看一下python中类是如何创建的。
如果有接触过面向对象,例如Java,那么对以下概念的理解应该不是很难。
关于类的简介
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。它是一种抽象的概念。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 实例变量:定义在方法中的变量,只作用于当前实例的类。
- 继承:即一个子类继承父类的属性和方法。继承也允许把子类的对象作为一个父类对待。例如B继承自父类A,但是B也可以作为父类,继续派生出一个子类C。
- 方法:类中定义的函数。
- 实例化:创建一个类的实例,类的具体对象。
- 对象:所谓对象,就是类的实例化。假设我们将 int 这个数据类型视作一个类,它本身是不存在于内存中的,它是一种抽象的概念或者说模板,但是如果我们定义了一个 int 类型的变量:int a;那么a就是int的对象,这个定义的过程就是实例化。a是实际存在于内存中的。
创建类的语法
class ClassName:
<statement-1>
.
.
.
<statement-N>
例如创建一个名为rectangle的类,它有两个属性:长(width),宽(heigh);一个计算面积的方法:area().
class rectangle:
width=0
height=0
def area(self):
return self.width*self.height
self 代表类的实例,而非类;这是一个特殊的字段,用于类内部定义方法时,来调用其本身的参数。
>>> x=rectangle() >>> x.width=3 >>> x.height=4 >>> x.area() 12 >>> y=rectangle() >>> y.width=6 >>> y.height=7 >>> y.area() 42
当用实例x.area()调用时,self指向x;当使用y.area()调用时,self指向y。
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self
我们可以创建一个名为x的长方形实例,可以看到x以及存在于内存的0x02288D50位置,且其长宽均为0
>>> x=rectangle()
>>> x
<__main__.rectangle instance at 0x02288D50>
>>> x.width
0
>>> x.height
0
但是一般我们创建实例时,需要初始化,比如创建一个长为3,宽为4的长方形.可以这样。
class rectangle:
width=0
height=0
def area(self):
return self.width*self.height
>>> x=rectangle()
>>> x.width=3
>>> x.height=4
>>> x.width
3
>>> x.height
4
>>> x.area()
12
但是这种定义中,width和height是定义在方法之外的变量,属于整个类共有的变量。是所有实例共享的,也就是说,如果采用第一种方式定义rectangle类,只要修改一个实例,其他实例的长宽都会随之变化。这是绝对不能接受的。
class rectangle:
width=0
height=0
def area(self):
return self.width*self.height
>>> x=rectangle()
>>> y=rectangle()
>>> x.width=3
>>> x.height=4
>>> y.width
3
>>> y.height
4
另外,这样定义每次初始赋值时都需要用 x.width 和 x.height 来访问,很麻烦。所以,通常在定义类的时候,我们会定义一个特殊的初始化函数 __init__(),这样每次创建实例时都会调用这个函数,一方面这会使变量可以被不同的实例绑定,另一方面也是方便初始化。
class rectangle:
def __init__(self,width,height):
self.width=width
self.height=height
def area(self):
return self.width*self.height
然后实例化时就可以向下面这样,方便很多。
>>> x=rectangle(3,4)
>>> x.area()
12
通俗的来说,我们定义“人”是一个类,人那么我们每个人都是这个类的一个对象,当有小孩出生的时候,就是这个类的实例化,我们需要给这个新的对象赋予一个属于他自己的“名字”属性,如果我们将“名字”这个属性定义成了公共的变量,那么我们所有人的“名字”就都是一样的,而且每个人都可访问和修改这个“名字”,这是不行的。
因此“名字”这个属性必须要定义在一个__init__(self,name [,其他属性]) 的初始化函数中,保证我们每个人的名字是被我们自己所绑定的,我们改名字/取名字时,不会对其他人的“名字”有影响。
我们可以通过“.”来访问和修改实例的属性,通过del来删除属性。属性删除后,相关的方法会报错。
>>> x=rectangle(7,8)
>>> x.area()
56
>>> x.width
7
>>> del x.width
>>> x.area()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in area
AttributeError: rectangle instance has no attribute 'width'
也可以通过如下函数来访问属性
- getattr(obj, name[, default]) : 访问对象的属性。
- hasattr(obj,name) : 检查是否存在一个属性。
- setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。
- delattr(obj, name) : 删除属性。
hasattr(x, 'width') # 如果存在 'width' 属性返回 True。 getattr(x, 'width') # 返回 'width' 属性的值 setattr(x, 'width', 8) # 添加属性 'width' 值为 8 delattr(x, 'width') # 删除属性 'width'
类的其他属性
一:我们定义的类的属性到底存到哪里了?有两种方式查看 dir(类名):查出的是一个名字列表 类名.__dict__:查出的是一个字典,key为属性名,value为属性值 二:特殊的类属性 类名.__name__# 类的名字(字符串) 类名.__doc__# 类的文档字符串 类名.__base__# 类的第一个父类 类名.__bases__# 类所有父类构成的元组 类名.__dict__# 类的字典属性 类名.__module__# 类定义所在的模块 类名.__class__# 实例对应的类(仅新式类中)
刚刚发现了一篇python面向对象讲述的比较好的博文,条理性也挺好,博主貌似还是一名比较腻害的程序媛 ,上面权当抛转引玉了,就不再继续写了。想继续了解的话就去看看,楼主先行一步。
python之路——初识面向对象 http://www.cnblogs.com/Eva-J/articles/7293890.html
下一篇: 构造器初始化