范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

类函数成员函数静态函数抽象函数方法伪装属性

  十五、类函数、成员函数、静态函数、抽象函数、方法伪装属性
  本篇博客是滚雪球学 Python 第二轮的最后一篇博客,我们将内容继续提升到面向对象部分,为你补充类里面的一些装饰器,学习之后,希望你的 Python 基础知识可以更上一层楼。  15.1 类函数 @classmethod
  先直接看代码,再对代码内容进行分析与学习。  class My_Class(object):      # 在类定义中定义变量     cls_var = "类变量"      def __init__(self):         print("构造函数")         self.x = "构造函数中的属于实例变量"      # 类方法,第一个参数必须默认传类,一般习惯用 cls。     @classmethod     def class_method(cls):         print("class_method 是类方法,类名直接调用")         # 类方法不可以调用类内部的对象变量(实例变量)         # print(cls.x)  # 类方法可以通过类名直接调用,也可以通过对象来调用 # 即使通过实例调用类方法,Python 自动传递的也是类,而不是实例 My_Class.class_method() my_class_dom = My_Class() # 通过类的对象调用 my_class_dom.class_method()
  首先要掌握的是类函数的定义格式,在普通函数的前面添加装饰器   @classmethod  ,该函数就会转换为类函数,同时函数的第一个参数默认是 cls  ,该变量名可以任意,建议使用成 cls  ,这个是程序员之间的约定。 @classmethod     def class_method(cls):
  同时类函数在调用的时候,可以通过   类名.   的形式进行调用,也可以通过 对象.   的形式调用,不过这两种调用都只是将类传递到了函数内部,不存在差异。
  类函数不能调用实例变量,只能调用类变量,所谓类变量就是在类中独立声明,不在任何函数中出现的变量。在上述代码中,类变量声明部分代码如下:class My_Class(object):     # 在类定义中定义变量     cls_var = "类变量"
  在 Python 中,大部分   @classmethod   装饰的函数末尾都是 return cls(XXX)  , return XXX.__new__ ()   也就是 @classmethod   的一个主要用途是作为构造函数。15.2 静态函数 @staticmethod
  先掌握一个概念,静态函数不属于它所在的那个类,它是独立于类的一个单独函数,只是寄存在一个类名下,先建立这个基本概念,后面学起来就简单很多了。  class My_Class(object):     # 类变量     cls_var = "类变量"      def __init__(self):         # 在构造函数中创建变量         self.var = "实例变量"      # 普通的对象实例函数     def instance_method(self):         # 可以访问类变量         print(self.cls_var)         # 可以访问实例变量         print(self.var)         print("实例化方法")      @staticmethod     def static_method():         print(My_Class.cls_var)         # 无法访问到实例变量         # print(My_Class.var)         # print(self.var)         print("静态方法")  my_class = My_Class() my_class.instance_method()  # 通过对象访问 my_class.static_method() # 类名直接访问 My_Class.static_method()
  即使修改成下述代码,也是错误的,静态函数的第一个参数不是实例对象   self  ,或者可以理解为静态函数没有隐形参数,如需要传递参数,在参数列表中声明即可。    @staticmethod     def static_method(self):         print(My_Class.cls_var)         # 无法访问到实例变量         # print(My_Class.var)         print(self.var)         print("静态方法")
  在同一个类中,调用静态方法,使用   类名.函数名()   的格式。15.3 类函数与静态函数在继承类中的表现
  先创建一个父类,其中包含两个静态函数与一个类函数。   class F(object):      @staticmethod     def f_static(x):         print("静态方法,有 1 个参数")         print(f"f_static:{x}")      @staticmethod     def f_static_1():         print("静态方法,无参数")         return F.f_static(10)      @classmethod     def class_method(cls):         print("父类中的类方法")         return F.f_static(12)  f = F() f.f_static(11) f.f_static_1()  f.class_method()
  再编写一个   S   类继承自 F   类:class S(F):      @staticmethod     def f_static(y):         print("子类中重载了父类的静态方法")         print(f"子类中的参数{y}")      @classmethod     def class_method(cls):         print("子类中的类方法")  s = S() s.f_static(110) s.class_method() S.class_method()
  测试之后,基本结论如下:
  如果在子类中覆盖了父类的静态函数,那调用时使用的是子类自己的静态函数,
  如果在子类中没有覆盖父类的静态函数,那调用时使用的是父类的静态函数,
  类函数同样遵循该规则。
  如果希望在子类中调用父类的属性或者函数,请使用   父类名.   的形式实现。15.4 抽象函数 @abstractmethod
  被   @abstractmethod   装饰的函数为抽象函数,含抽象函数的类不能实例化,继承了含抽象函数的子类必须覆盖所有抽象函数装饰的方法,未被装饰的可以不重写。
  抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化,实现代码如下:  import abc  class My_Class(abc.ABC):      @abc.abstractmethod     def abs_method(self):         pass      def show(self):         print("普通")  class M(My_Class):     def abs_method(self):         print("xxx")  mm = M() mm.abs_method()
  抽象基类中学习还需要了解元类相关知识,在第三轮滚雪球学 Python 中将为你展开这部分内容。  15.5 方法伪装属性
  在 Python 面向对象的编码过程中,  对象.属性   来获取属性的值,使用 对象.方法()   来调用方法,通过装饰器 @property   可以将一个方法伪装成属性,从而使用 对象.方法   没有括号的形式调用。代码非常简单:class My_Class(object):      def __init__(self, name):         self.__name = name      @property     def name(self):         return self.__name  m = My_Class("橡皮擦") print(m.name)
  这种写法最直接的应用,就是将部分属性变成只读属性,例如,上述代码,你无法通过下述代码对   name   进行修改。class My_Class(object):     def __init__(self, name):         self.__name = name      @property     def name(self):         return self.__name  m = My_Class("橡皮擦") m.name = "擦哥擦姐" print(m.name)
  如果希望方法伪装的属性具备修改和删除功能,需要参考下述代码:  class My_Class(object):     def __init__(self, name):         self.__name = name      @property     def name(self):         return self.__name      @name.setter     def name(self, name):         self.__name = name      @name.deleter     def name(self):         del self.__name  m = My_Class("橡皮擦") m.name = "擦哥擦姐" print(m.name)
  上述代码在将   name   方法伪装成属性之后,可以通过 @name.setter   和 @name.deleter   对同名的 name   方法进行装饰,从而实现了修改与删除功能。
  所以一般使用方法伪装属性的步骤是:  @property   装饰器,可以用来将类中的方法伪装成属性;@方法名.setter   装饰器,在修改伪装成属性的方法值时会调用它;@方法名.deleter   装饰器,在删除伪装成属性的方法值时会调用它。
  如果你觉得这个比较麻烦,还存在一种方法伪装属性的方式。使用   property   函数,原型如下# 最后一个参数是字符串,调用 实例.属性.__doc__ 时的描述信息 property(fget=None, fset=None, fdel=None, doc=None)
  通过上述函数将方法伪装成属性的代码为:  class My_Class(object):     def __init__(self, name):         self.__name = name      def del_name(self):         del self.__name      def set_name(self, name):         self.__name = name      def get_name(self):         return self.__name     # 将方法伪装成属性     name = property(get_name, set_name, del_name) m = My_Class("梦想橡皮擦") print(m.name) m.name = "橡皮擦" print(m.name)  del m.name15.6 这篇博客的总结
  滚雪球学 Python 第二轮 15 篇博客在一次结束了,下一轮将在 4 月中旬再次开启,学 Python 我们一直在路上,希望本系列的课程对你的 Python 学习有所助力。

连专家都说不清楚的姓氏,10个人读,10个错百家姓在中国的姓氏文化里,有些冷门的姓氏一般人不认识很正常,毕竟姓氏文化也有专家。而今天我们要说的这个姓氏,不但10个人读,10个人错,就连研究姓氏文化的专家,都不清楚这个姓氏到底按辈分的谱取名,也好,也不好传统纸质家谱在中国的家谱文化中,字辈一直是很受关注的一个点。因为一个姓氏宗亲,家族的发展和传承,最先谈到的就是一个族人的姓名。对于家族里新添的人丁,取名是按辈分取好?还是不按辈分取秤砣虽小压千斤,DarmosharkK3数字键盘分享Darmoshark的产品总会给人带来很多惊喜,旗下首款键盘K1是金属外壳100键配列第二款K5又一下选择了时下比较热门的68键配列,赛车主题那款着实吸引眼球正当我疑惑这个编号跳跃木北造型有哪几种中药可以护发现如今生活节奏快,生活压力大,不少九零后甚至零零后在面对了一整天电脑之后,回家洗头都会惊恐地发现自己的头发一抓一大把全掉了,的确,木北造型指出,现在脱发现象已经是人们生活中一个很普周氏生物CEO郭民阐述企业核心管理重要步骤有哪些企业管理核心是客户服务团队建设,以及产品满足客户需求特性的创新与速度实施重点在于对客户需求特性的敏感程度与快速满足需求的响应保障实施到位在于面对客户一线人员的执行能力与行为表达力。郭珉管理课之企业财务管理企业管理专家郭珉表示,企业财务管理是在一定的整体目标下,关于资产的购置(投资),资本的融通(筹资)和经营中现金流量(营运资金),以及利润分配的管理。而企业的财务可以说是一个企业的血中国最复杂的姓氏,一共30笔,没几个会读?说起中国的姓氏文化,很多汉字在当作姓氏的时候,就改变了读音,也没少给人添麻烦。可是还有一些姓氏,光是写出来,就让人觉得头大。今天我们就来说说,被誉为中国复杂的姓氏爨姓。爨姓爨字论笔修谱别把积德做成了缺德老谱新修乱世藏金,盛世修谱。修谱的目的在于将家族的历史文化经验等予以总结,将优秀人物树立成家族成员学习追寻的榜样,将仁孝节义和等优良家风代代相传,从而达到家庭和谐家庭人才辈出的良性人数最少的姓氏,100人都不到,快消失了百家姓赵钱孙李,周吴郑王说起百家姓里面的这些大姓氏,相信很多人的身边,都不缺这些姓氏的朋友。在百家姓中,哪个姓氏的人数是最少的呢?据数据统计,贶姓就是最少的姓氏之一,在现有的人口统排第2的钱姓,来历靠偷工减料,没想到钱姓图腾吴越国的开国君主叫钱镠,是个了不起的英雄。到了钱镠的孙子钱俶或者叫钱弘俶的时候,北边的宋已经对吴越国形成了泰山压顶之势了,钱弘俶为了避免生灵涂炭,主动归顺了宋,这样吴越国也百家姓中的赵钱孙李,用苏州话反着读,笑岔气了赵钱孙李说起中国的姓氏文化,最常听到的一句话,就是赵钱孙李周吴郑王。作为排名在百家姓的前八位大姓,排名到底有什么规矩吗?其实光是第一句赵钱孙李,里面就有不少的秘密。百家姓相传百家姓
广州车展超前看丨多款重磅轿车蓄势待发,实力不容小觑不知不觉中,2021年已经进入尾声,同时第十九届广州国际汽车展览会也将于一个月后的11月1928日拉开帷幕,不少参展的重磅车型已经有了一些消息,今天小编就先给大家预热一波,看看那些广州车展超前看丨SUV成为主力?原来这几款新车都是狠角色2021年第十九届广州国际汽车展览将在11月19日11月28日开展,不少车型将在此次车展中亮相,而我国作为SUV车型的消费大国,SUV绝对会成为本次车展追捧的热点之一。今天小编就给每次10分钟跟我学Python(第七次课)大家好!我是幻化意识流,简称意识流。现在我们继续Python的学习。我们打开IDLE。来编写人生的第一个Python程序。今天的课程是了解单独的Python程序文件如何独立运行。如甲亢等甲状腺疾病是否会引起肢体偶尔拉伸时剧痛?关于这个话题,是个问题,也是个探讨。今日早上起床,我只伸了个懒腰,右上臂后侧肌肉拉伸时剧痛无比,阵痛大概1分钟后慢慢缓解。阵痛时身体不敢动,那种痛感发生时,感觉要窒息了。我强忍着,简测AENZR充电宝PD快充18W移动电源10000毫安随着越来越多的人购买高性能的手机,而手机功耗使得人们日常缺电应急。于是,各式各样的充电宝在市面上横飞,真正能做好移动电源的厂商也就只有知名手机或配件厂商。今天博主就给大家简测一下A电竞玩家必备酷炫耳机!1MoreSpearheadVR电竞头戴式耳机大家好!今天给大家带来的是Zaaap!平台提供的1MoreSpearheadVR电竞头戴式耳机!1More想必大家也比较熟悉了,国内知名的耳机厂商,周杰伦吴青峰,都是其代言人,其耳来自北欧神话的女神耳机kineraIDUN今天给大家带来一位新朋友Kinera,今天的主角是他们家的百元塞IDUN。想必大家对于kinera这个品牌也感到陌生,那么今天我先给大家介绍一下这家在国外赫赫有名的耳机公司吧!Ki新奇设计,锐利异类FIILCC大家好,今天给大家带来的是FIIL耳机新品FIILCC耳机。在TWS耳机都往入耳式做的趋势下,FIIL推出的这款半入耳式耳机到底是怎么样的呢?那就跟着我的文章来看看FIILCC到底乐歌S6Pro智慧工作台不仅仅是增高最近是收到了乐歌寄来的乐歌S6Pro这款智慧工作台,那么经过一番体验后就给大家出这么一期评测来看看这款智慧工作台到底有多智慧!工作台颜值很在线,白色为主色调再配上一圈浅色布艺包围,PaMuSlideMini测评国产真无线蓝牙耳机也能这么棒!大家好,今天给大家带来的是这款派美特家的PaMuSlideMini!作为一款真无线蓝牙耳机,它到底有何过人之处呢?请看我为大家介绍这款不一般的产品!先来看看外观吧!包装使用的是黑底小米10Pro影像方向真的错了?对比OPPO荣耀确实错了相机是手机近年来发展最猛的一个地方,不仅后置摄像头的数量越来越多,而且像素和传感器的底也越来越高,最具代表的就是一亿像素主摄的小米10。不过近期随着OPPOFindX2系列的推出,