PYTHON小白:第十五天

PYTHON小白:第十五天
1、 再论类命名空间
Python的类就像命名空间。Python程序默认处于全局命名空间内,类体则处于类命名空间内,Python允许在全局范围内放置可执行代码–当Python执行该程序时,这些代码就会获得执行的机会;类似地,Python同样允许在类范围内放置可执行代码–当Python执行该类定义时,这些代码同样会获得执行的机会。

下面代码示范了在全局空间和类命名空间内分别定义lambda表达式。

全局空间内定义的lambda表达式就相当于一个普通函数,因此程序使用调用函数的方式来调用该lambda表达式,并显式地为第一个参数绑定参数值,
对于在类命名空间内定义的lambda表达式,则相当于在该类命名空间中定义了一个函数,这个函数就变成了实例方法,因此程序必须使用调用方法的方式来调用该lambda表达式,Python这样会为该方法的第一个参数(相当于self数)绑定参数值。
2、 成员变量
在类体内定义的变量,默认属于类本身,如果把类当成类命名空间,那么该类变量其实就是定义在类命名空间内的变量。
2.1类变量和实例变量
在类命名空间内定义的变量就属于类变量,Python可以使用类来读取、修改类变量。

对于类变量而言,它们就是属于在类命名空间内定义的变量,因此程序不能直接访问这些变量,程序必须使用类名来调用类变量。不管是在全局范围内还是函数内访问这些类变量,都必须使用类名进行访问。
实际上,Python完全允许使用对象来访问该对象所属类的类变量(当然还是推荐使用类访问类变量)。

由于通过对象访问类变量的本质还是通过类名访问,因此如果类变量发生了改变,当程序访问这些类变量时也会读到修改之后的值。

Python允许通过对象访问类变量,但如果程序通过对象尝试对类变量赋值,此时性质就变了–Python是动态语言,赋值语句往往意味着定义新变量。
因此,如果程序通过对象对类变量赋值,其实不是对“类变量赋值”,而是定义新的实例变量。

如果程序通过类修改了两个类变量的值,程序中Inventory的实例变量的值也不会受到任何影响。

同样,如果程序对一个对象的实例变量进行了修改,这种修改也不会影响类变量和其他对象的实例变量。

2.2使用property函数定义属性
如果为Python类定义了getter、setter等访问器方法,则可使用property()函数将它们定义成属性(相当于实例变量)。
property()函数的语法格式如下:

从上面的语法格式可以看出,在使用property()函数时,可传入四个参数,分别代表getter方法、setter方法、del方法和doc,其中doc是一个文档字符串,用于说明该属性。当然,开发者调用property可传入0个(既不能读,也不能写的属性)、1个(只读属性)、2个(读写属性)、3个(读写属性,也可删除)和4个(读写属性,也可删除,包含文档说明)参数。

在使用property()函数定义属性时,可根据需要只少量的参数。

在某些编程语言中,类似于这种property合成的属性被称为计算属性。这种属性并不真正存储任何状态,它的值其实是通过某种算法计算得到的,当程序对该属性赋值时,被赋的值也会被存储到其他实例变量。
还可使用@property装饰器来修饰方法,使之成为属性。

当程序使用@property修饰了state属性之后,又多了一个@ state.setter装饰器,该装饰器用于修饰state属性的setter方法.这样state属性就有了getter和setter方法,state属性就变成了读写属性。
使用@property修饰了is_dead方法,该方法就会变成is_dead属性的getter方法,此处同样会多出一个@is_dead.setter装饰器,但程序并未使用该装饰器修饰setter方法,因此dead属性只是一个只读属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值