Python趣味入门13:类中的各种变量

这篇具有很好参考价值的文章主要介绍了Python趣味入门13:类中的各种变量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

小牛叔带你飞越类的门槛

其中我们已知道定义变量在类中就表示为属性。但是在不同的位置定义变量会有不同的作用,并且采用不同的命名方式,也会让变量具有不同的作用

本文假设有一个类指南针(compass),可想象成某个地图游戏中帮助主角寻找方向,也是本节主要的示例。

1. 类属性与实例属性

compass类的定义如下代码:

1 class Compass:
2     invitedBy = '中国'
3     usedFor ='导航'
4     #初始化方法
5     def __init__(self):
6         self.shape = 'round'

 

1.1 类属性

可以看到和Bread不同,Compass类定义了2个变量分别是invitedBy发明者,usedFor用处。都是类属性,这2个变量(即类属性)代表的意义,归所有“指南针”同时具有的,它们的值与“类”实例化出的“实例”无关。在面向对象中,把这样的变量叫做类属性(也可以叫类变量、静态变量)。

类属性定义完成后也通过“实例名.变量名”的形式进行读取数值,如下语句所示:

com1,com2 = Compass(),Compass()
print(com1.invitedBy,com2.invitedBy)

 

运行的结果是:

中国 中国

如类属性需要改变值,必须通过“类名.变量名”这样的形式进行赋值,请参看下面的代码把这两个属性值改成英文表达:

Compass.invitedBy = 'CN'
print(com1.invitedBy,com2.invitedBy)

 

上面代码改变了类变量的值,但从Compass类实例化出来的所有的实例的值都会改变,运行结果如下:

中国 中国
CN CN

需要说明的是,类属性无法通过“实例.变量名”这种形式赋值的,如果你这样做了,Python是会根据规则做出误判断,认为这种形式的赋值是给“实例属性”赋值,而不是“类属性”。系统并不会出错,只会产生一个与类属性相同名称的实例属性名,从而把同名的类属性给“覆盖”掉,继续在上面的语句后面添加如下的语句:

com1.invitedBy = 'Korean'
print(com1.invitedBy,com1.__class__.invitedBy,com2.invitedBy)

 

上面语句中,使用了“特殊变量”__class__,它指向该实例的类。通过如下对比一下第2句显示的2个值有什么不同。

com1.invitedBy:指的是com1实例的invitedBy属性,可以是“实例属性”也可以是“类属性”,但“实例属性”优先。

com1.__class__.invitedBy:__class__变量会返回实例的类,因此invitedBy一定表示“类变量”。把com1实例的“类变量”invitedBy“错误”赋值后,再看看会不会产生“覆盖的效果”,整个程序的运行结果如下:

中国 中国
CN CN
Korean CN CN

看到如果企图通过实例来对“类属性”进行赋值Korean,只会新创建该实例属性并且赋于新值Korean,并且这个值只会覆盖企图通过“实例名.类变量名”方式来取得类属性的值。

对于“类属性”,我们一般把类的通用的属性、共同的数据或是需要集中的数据,通过类变量的方式存储,这样就可以操作实例共同的属性或是方便批量操作。

比如使用类Student来管理学生信息,一般会把学生的成绩数据库,存储在类变量(类属性)里,这样操作员只要访问类,就可以取得所有同学的成绩。

1.2 私有变量

在进行类定义时,可以定义某些变量只能在类的内部使用,外部无法使用的,称之为私有变量。要声明私有变量,使用2个下划线开头来进行命名,比如指南针实例有一个私有变量__magnetism记录了指针的磁性,这个数据一般不使用,但是可能在实现内部功能的时候会有用处。如下:

class Compass:
    invitedBy = '中国'
    usedFor ='导航'
    #初始化方法
    def __init__(self):
        self.shape = 'round'
        self.__ magnetism = 4

 

上面代码定义了实例属性shape形状,默认值是round(圆形),定义了“私有变量”__magnetism设置为4,用来表示指针的磁力。试试从“外部”来访问这个私有变量能不能访问成功:

com1,com2 = Compass(),Compass()
print(com1.__ magnetism)

 

这时系统运行的结果出错,出错信息如下:

AttributeError: 'Compass' object has no attribute '__magnetism’

中文意思为:属性错误“Compass”对象没有__magnetism的属性。

由于私有变量不能被外部访问,这种机制起到了保护变量的作用,但它的值并不是不能改变的,可以把设置私有变量的活交给普通的类内部的方法。如下:

def setMag(self,mag_level=4):
    self.__magnetism = mag_level

 

上面setMag的方法就完成了设置私有变量的值的任务,上例当中私有变量__magnetism用来反馈指针的磁性,只要指针可以正常工作一般不太关心它的值,但如果这个值太小,就会造成指南针根本无法工作,人们更加关心的是指南针能否正常工作。所以有一个返回工作状态的方法,写法如下:

 def getStatus(self):
     return self.__magnetism>=1 if "正常" else "失效"

 

PS: 代码结尾返回“三元运算”表达式,当磁性大于等于1时,返回工作状态为“正常”,否则就返回“失效”。

看看这个私有变量能否正常的工作,所有的程序如下:

class Compass:
    invitedBy = '中国'
    usedFor ='导航'
    #初始化方法
    def __init__(self):
        self.shape = 'round'
        self.__magnetism = 4
    def setMag(self,mag_level=4):
        self.__magnetism = mag_level
    def getStatus(self):
        return "正常" if self.__magnetism>=1 else "失效"
 
com1,com2 = Compass(),Compass()
com1.setMag(1)
com2.setMag(0.5)
print(com1.getStatus(),com2.getStatus())
#下面的语名会出错
print(com1.__magnetism)

 

在上面的程序里,最后1行我们试图访问类的私有变量,因此会出错。如下:

正常 失效
Traceback (most recent call last):
 File "/Users/…/books/第7章 类和对象/7.4.2 类内部变量.py", line 18, in <module>
 print(com1.__magnetism)
AttributeError: 'Compass' object has no attribute '__magnetism'

 

从运行结果的第1行看,把2个指南针的磁性分别设置成1和0.5,就会分别得出正常和失效的状态,程序的前半部分运行成功。

此处稍作延伸,编写类的“方法”时,即类中定义的函数,也有一类叫私有函数,其命名的方式就是以两个下划线开头__MethodName()。这部分的内容同学们可以自行学习,因为后面不会用到。

最后,同学们应该了解一下私有变量的实现的原理。在Python当中,默认所有的变量与方法都是外部可访问的,在内部为了实现私有变量的功能,比如在类cls下定义了一个私有变量__a,系统在运行的时候会把这个变量改写成_cls__a,即单划线+“类名”+私有变量名。如果你知道了,试试看本例中你想从外部显示__ magnetism的值真正应该写什么样的语句?文章来源地址https://www.toymoban.com/news/detail-767411.html

类本身具有比较复杂的性质,收藏本文章,可以今后慢慢学习吧!小牛叔与你共同进步!

到了这里,关于Python趣味入门13:类中的各种变量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python趣味入门11:函数作为参数以及匿名函数

    Python里可以把函数本身当成是参数,比如Python内置函数map可以通过传入的函数返回值来一一映射列表集合里的元素,我们也可以在定义函数时,以调用函数的方式使用参数。 假设有一个列表1至9共有9个元素,现在需要求其平方数列。 map函数的示例   以上的代码,主要完成了

    2024年02月04日
    浏览(40)
  • 【亲测 | 004】趣味测试小程序源码各种测试(趣味测试、爱情测试、缘分测试、性格测试) | 极致技术工厂

    该源码里面包含了多种评测,每一种评测都包含大多小细节 小编也给它加了几个流量主位置以便大家可以更好的运营。 这款小程序测试非常舒服 没发现任何问题,可以直接发布。 也满觉得有趣也算是精品! 小程序源码导入之前,需要开通小程序账号,并且AppId复制过来填写

    2024年02月14日
    浏览(27)
  • 【C语言趣味教程】(6) 作用域:局部变量 | 全局变量 | 局部变量优先原则 | 利用大括号限制作用域 | 变量的生命周期

        🔗 【C语言趣味教程】专栏介绍👈 猛戳了解!!! 0x00 引入:什么是作用域? 变量和常量在程序中都是有作用范围的,这个范围我们称之为变量的  作用域 (scope) 。 作用域也称为 \\\"定义域\\\",是程序中 定义的变量所存在的区域,出了该区域变量就不能被访问。 变量的作

    2024年02月14日
    浏览(43)
  • 【C语言趣味教学】(6) 作用域:局部变量 | 全局变量 | 局部变量优先原则 | 利用大括号限制作用域 | 变量的生命周期

        🔗 【C语言趣味教程】专栏介绍👈 猛戳了解!!! 0x00 引入:什么是作用域? 变量和常量在程序中都是有作用范围的,这个范围我们称之为变量的  作用域 (scope) 。 作用域也称为 \\\"定义域\\\",是程序中 定义的变量所存在的区域,出了该区域变量就不能被访问。 变量的作

    2024年02月14日
    浏览(26)
  • 【C语言趣味教程】(4) 变量:代码注释 | 变量的声明 | 初始化与赋值 | 作用域与生命周期 | 局部变量与全局变量

      🔗 《C语言趣味教程》👈 猛戳订阅!!! 0x00 引入:注释的作用 \\\"程序员最讨厌两种人:一种是不写注释的人,一种是让我写注释的人。\\\" 相信大家对注释早已有所耳闻,对于注释,C 语言有两种注释风格,我们下面会逐个讲解。   但在这之前,我们先来了解了解注释的作

    2024年02月15日
    浏览(37)
  • 【C语言趣味教程】(4) 变量:代码注释 | 变量的声明 | 初始化与赋值 | 变量的命名 | 关键字 | 标识符 | 变量名的命名规范

      🔗 《C语言趣味教程》👈 猛戳订阅!!! 0x00 引入:注释的作用 \\\"程序员最讨厌两种人:一种是不写注释的人,一种是让我写注释的人。\\\" 相信大家对注释早已有所耳闻,对于注释,C 语言有两种注释风格,我们下面会逐个讲解。   但在这之前,我们先来了解了解注释的作

    2024年02月15日
    浏览(34)
  • string类中的一些问题

        前言:C++中的string类是继承C语言的字符数组的字符串来实现的,其中包含许多C的字符串的相关知识的同时,也蕴含很多的类与对象的相关知识,在面试中,面试官总喜欢让学生自己来模拟实现string类,最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函

    2024年02月10日
    浏览(31)
  • ts 类中的修饰符

    修饰符:类中的 成员的修饰符 ,主要是描述类中的成员( 属性 , 构造方法 , 方法 )的 可访问性 类中的成员都有自己的 默认修饰符 public 修饰符有哪几种? public : 公共的 ,任何位置都可以访问 private : 私有的 ,只有 自身内部可以访问 ,外部、子类中都无法访问该成

    2024年02月08日
    浏览(27)
  • Python中的13个搔操作

    1.字符串的翻转 2.判断字符串是否是回文 利用字符串翻转操作可以查看字符串是否回文 3.寻找字符串中唯一的元素 去重操作可以借助 set 来进行 4.判断字符串所含元素是否相同 判断字符串中包含的元素是否相同,无论字符串中元素顺序如何,只要包含相同的元素和数量,就认

    2024年02月05日
    浏览(23)
  • C++ | 说说类中的static成员

    【概念】:声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为 静态成员变量 ;用static修饰的成员函数,称之为 静态成员函数 。静态成员变量一定要在类外进行初始化 💬 面试题:实现一个类,计算程序中创建出了多少个类对象 上面这个是曾经一家公

    2023年04月24日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包