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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值