欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python 类的初识

程序员文章站 2022-04-11 17:02:01
...

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