首页 > 其他分享 >类定义中的三种变量的总结

类定义中的三种变量的总结

时间:2022-11-21 08:24:00浏览次数:63  
标签:Goods 变量 self TotalValues 实例 三种 定义

 

文章目录

 


前言

学习函数时候,我们讨论局部变量和全局变量,学习类时候我们开始讨论类变量、实例变量、局部变量。学习思路都是准确理解这些变量是在那个范围内共享。

  • 类变量是所有类实例对象共享(可以通过对象.类变量可以访问,但是不能通过对象.类变量修改),要修改使用类名.类变量
  • 实例变量,是类的所有类方法共享(可以通过self.实例变量访问和修改),即如果有两个或以上个方法要使用一个变量,不管是访问还是修改,你必须定义为实例变量。
  • 局部变量(临时变量),如果仅仅是当前方法需要,如for循环的 for i in range(0,10) 的i就是局部变量和临时变量。可能称呼临时变量更为准确,临时用,用完就立刻丢弃。

类定义中的三种变量的总结

序号名称描述
1 类变量 定义在类中,但是在定义类方法外定义的变量。
2 实例变量 实例变量指的是在任意类方法内部,以“self.变量名”的方式定义的变量。
3 局部变量 实例变量指的是在任意类方法内部,以“变量名”的方式定义的变量。我们之前常用循环语句 for i in range(0,10),i 就是局部变量。

1、变量使用的共享范围是我们定义为哪一种变量的依据。

  1. 类变量是实例对象中共享。反过来说如果不需要实例对象之间共享,不要定义为类变量。
  2. 实例变量是实例对象自身范围使用,在类方法可以共享。反过来说如果不需要类方法共享,不要定义为实例变量。
  3. 局部变量是在实例对象的某一个类方法内使用,不打算共享给实例对象内其他方法使用,属于用完就丢弃的使用局部变量。
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

总结

  1. 类是把数据和方法封装的方式,当然在面向过程编程看来,函数也是一种封装语句方式。封装是类的特性,封装目的一是重用,二是隔绝。隔绝理解为,如果一件事情很复杂,逻辑很长,就应该拆开几个小并使用组合方式来完成一个长逻辑的实现,当然对比面向过程,代价就是我们又加了一层。
  2. 采用何种变量是对实际使用的辩证,基本上原则就是够用就好。如果定义了大量的类变量或者实体变量,但是只是局部用到,这里就显得很不划算,局部变量是用完可以回收的;另外我们命名可能出现大量同名,导致后面代码可能覆盖了,产生同名误用。
  3. 另外从程序的生存期来看,临时使用,就用局部变量,整个程序周期都要使用全局变量或者类变量。全局变量这个不解释了,从本质上来类变量和全局变量一回事,只不过类变量,必须通过类名.类变量方式访问,这里用类封装一个全局变量,实现全局变量的隔绝。
 

标签:Goods,变量,self,TotalValues,实例,三种,定义
From: https://www.cnblogs.com/clark1990/p/16910253.html

相关文章

  • 基于python中的静态方法,类方法以及类变量的用法
    基于python中的静态方法,类方法以及类变量的用法最近在做scada系统的自动化部署,采用python语言,在开发过程中用到了,静态方法,类方法,以及类变量,下面就这个特殊的用法做个......
  • 第五十三章 开发自定义标签 - Using csr %cspQuote Methods
    第五十三章开发自定义标签-Usingcsr%cspQuoteMethodsUsingcsr%cspQuoteMethods%cspQuote例程定义包含两个不同引用方法的定义。QuoteQuoteCSPQuoteMe......
  • 接口中定义静态方法和默认方法(JDK8)
    JAVA8之前,接口里的方法要求全部是抽象方法。JAVA8(含8)之后,以后允许在接口里定义默认方法和静态方法。JDK8新特性_默认方法Java8及以上新版本,允许给接口添加一个......
  • NP/P/NP-hard问题定义
    P问题:是指在多项式时间内可以找出解的决策问题NPnon-deterministic.当给出决策问题的答案的时候可以很容易(多项式时间内)验证该答案是正确的,那么这类决策问题就是NP的......
  • [排序算法] 快速排序 (C++) (含三种写法)
    快速排序解释快速排序QuickSort与归并排序一样,也是典型的分治法的应用。(如果有对归并排序还不了解的童鞋,可以看看这里哟~归并排序)❤❤❤快速排序的分治模式1、......
  • 网页背景图自定义比例缩小或扩大覆盖整个页面
    body{background-size:cover;text-align:center;/*此部分支持chrome,应该也支持firefox*/background:rgb(246,248,249);background:url(../img/......
  • Vue3组件Props属性名不能与Setup()中变量名不可重复
    npmrunlint,显示错误点:30:9   error Gettingavaluefromthe`props`inrootscopeof`setup()`willcausethevaluetolosereactivity vue/no-setup-pr......
  • 2.6.3 变量内存单元地址
    变量存储在哪里变量内存单元地址代码实现#include<iostream>usingnamespacestd;intmain(){ intn; floatf; doubled=1.23;//0.0 charc='*'; cout......
  • 定义判断 序章说明
    国考10题省考5到12题根据图干给出的定义数量,可以分为单定义和多定义两者解题思路和方法一致,只不过多定义判断,一般问什么优先看什么 常见误区误区:只有把题......
  • 2.6.2 变量类型
    思考变量为何要指定类型不同类型,差别是什么变量类型用途告诉计算机如何操作数据即:类型“暗示”了运算的操作办法。不同类型的数值,它们参与运算的“操作规则”是不同的......