前言
学习函数时候,我们讨论局部变量和全局变量,学习类时候我们开始讨论类变量、实例变量、局部变量。学习思路都是准确理解这些变量是在那个范围内共享。
- 类变量是所有类实例对象共享(可以通过对象.类变量可以访问,但是不能通过对象.类变量修改),要修改使用类名.类变量。
- 实例变量,是类的所有类方法共享(可以通过self.实例变量访问和修改),即如果有两个或以上个方法要使用一个变量,不管是访问还是修改,你必须定义为实例变量。
- 局部变量(临时变量),如果仅仅是当前方法需要,如for循环的 for i in range(0,10) 的i就是局部变量和临时变量。可能称呼临时变量更为准确,临时用,用完就立刻丢弃。
类定义中的三种变量的总结
序号 | 名称 | 描述 |
---|---|---|
1 | 类变量 | 定义在类中,但是在定义类方法外定义的变量。 |
2 | 实例变量 | 实例变量指的是在任意类方法内部,以“self.变量名”的方式定义的变量。 |
3 | 局部变量 | 实例变量指的是在任意类方法内部,以“变量名”的方式定义的变量。我们之前常用循环语句 for i in range(0,10),i 就是局部变量。 |
1、变量使用的共享范围是我们定义为哪一种变量的依据。
- 类变量是实例对象中共享。反过来说如果不需要实例对象之间共享,不要定义为类变量。
- 实例变量是实例对象自身范围使用,在类方法可以共享。反过来说如果不需要类方法共享,不要定义为实例变量。
- 局部变量是在实例对象的某一个类方法内使用,不打算共享给实例对象内其他方法使用,属于用完就丢弃的使用局部变量。
class Goods:
# 定义商品类
# 属性:数量和单价
# 功能:计算总价功能
# 还有存放商品总价格类变量
TotalValues = 0
def __init__(self, name, price=0, num=0):
self.name = name
self.price = price
self.num = num
def getName(self):
return self.name
def getPrice(self):
return self.price
def getNum(self):
return self.num
def getTotalValue(self):
return self.price * self.num
print('Goods.TotalValues:',Goods.TotalValues)
shampoo = Goods('shampoo', 16, 1)
Goods.TotalValues += shampoo.getTotalValue()
soap = Goods('Soap', 5, 2)
Goods.TotalValues += soap.getTotalValue()
print('Goods.TotalValues:', Goods.TotalValues)
print(Goods.TotalValues)
print(shampoo.TotalValues)
print(soap.TotalValues)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
Goods.TotalValues: 0
Goods.TotalValues: 26
26
26
26
- 1
- 2
- 3
- 4
- 5
商品定义TotalValues用于累计计算商品总价。类变量可以对象访问,但是无法通过对象修改。所以我们不建议采用对象来访问类变量,因为我们访问时一回事,而修改又是另外一回事。
- 当使用对象.变量访问时候,顺序是先找对象实例变量,如果找不到就找类变量。
- 当使用对象.变量试图修改类变量时候。
如修改成:shampoo.TotalValues+=shampoo.getTotalValue()。
注意了,这个语句并不是调用Goods的类变量TotalValues修改,而是定义一个shampoo的TotalValues的实例变量。因为python允许我们在外部进行动态增加实例变量,shampoo.TotalValues+=shampoo.getTotalValue()
语句表示shampoo对象增加一个实例变量TotalValues,跟Goods.TotalValues类变量没有任何关系。
2、变量摆放位置和命名方式解释器解释为何种变量。
class Goods:
# 类变量:类方法之外的定义变量
TotalValues = 0
def __init__(self, name, price=0, num=0):
# 实例变量:在类方法使用"self.变量名"
self.name = name
self.price = price
self.num = num
def getName(self):
return self.name
def getPrice(self):
return self.price
def getNum(self):
return self.num
def getTotalValue(self):
return self.price * self.num
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
总结
- 类是把数据和方法封装的方式,当然在面向过程编程看来,函数也是一种封装语句方式。封装是类的特性,封装目的一是重用,二是隔绝。隔绝理解为,如果一件事情很复杂,逻辑很长,就应该拆开几个小并使用组合方式来完成一个长逻辑的实现,当然对比面向过程,代价就是我们又加了一层。
- 采用何种变量是对实际使用的辩证,基本上原则就是够用就好。如果定义了大量的类变量或者实体变量,但是只是局部用到,这里就显得很不划算,局部变量是用完可以回收的;另外我们命名可能出现大量同名,导致后面代码可能覆盖了,产生同名误用。
- 另外从程序的生存期来看,临时使用,就用局部变量,整个程序周期都要使用全局变量或者类变量。全局变量这个不解释了,从本质上来类变量和全局变量一回事,只不过类变量,必须通过类名.类变量方式访问,这里用类封装一个全局变量,实现全局变量的隔绝。
原文地址:http://www.cnblogs.com/clark1990/p/16910253.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性