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

Python面向对象编程进阶篇

  前言
  在上一篇《Python面向对象编程-初级篇》中,主要介绍了面向对象相关概念、面向对象相关术语、获取或添加对象属性、魔法方法以及Python的内置属性,本篇内容则继续介绍面向对象进阶部分的内容:面向对象的三大特性:封装、继承、多态类中的三类变量:类变量、成员变量、局部变量类中的私有方法和私有属性类的三类方法:实例方法、类方法、静态方法一、面向对象的三大特性:封装、继承、多态1.封装
  封装就是把内容封装到某个地方,后面再从某处调用被封装的内容函数式编程的封装def work(name, age, work):     print(f"我叫{name},我今年{age}岁了,我的工作是{work}")  def interest(name, age, interest):     print(f"我叫{name},我今年{age}岁了,我的爱好是{interest}")  def city(name, age, city):     print(f"我叫{name},我今年{age}岁了,我的家乡是{city}")  work("小明", 28, "司机") interest("小明", 28, "滑雪") city("小明", 28, "北京")
  面向对象编程的封装class Introduction(object):     def __init__(self, name, age, city, work, interest)         self.name = name         self.age = age         self.city = city         self.work = work         self.interest = interest      def intro(self):         print(f"我叫{self.name},我今年{self.age}岁了,我的家乡是{self.city},工作是{self.work},爱好是{self.interest}")  intro1 = Introduction("小明", 28, "北京", "司机", "滑雪") intro1.intro() intro2 = Introduction("小华", 22, "上海", "学生", "篮球") intro2.intro()
  上述对比可以看出,如果使用函数式编程,需要在每次执行函数时传入相同的参数,如果参数较多,则需要多次复制粘贴;而对于面向对象,只需要在创建对象时,将所有需要的参数封装到当前对象中,之后再次使用时,通过self间接去当前对象中取值即可。使用面向对象的思想可以更好地模拟现实生活中的事物。2.继承
  通过继承创建的类称为子类或派生类,被继承的类称为基类、父类或超类,子类可以继承父类的内容,调用父类中的属性或方法。1)子类继承父类
  如果在子类中需要父类的构造方法就需要显式地调用父类的构造方法,或者不重写父类的构造方法class ParentObject(object):     def __init__(self, height):         self.name = "当当"         self.age = 5      def parent_func(self):         print("这是父类中的方法")  class ChildObject(ParentObject):     def child_func(self):         print("这是子类中的方法")  child = ChildObject() child.parent_func()  # 这是父类中的方法 child.child_func()  # 这是子类中的方法 print(ChildObject.__bases__)  # (,)2)子类继承父类中的构造方法
  如下案例:子类ChildObject继承了父类ParentObject,如果想要在子类的构造方法中继承父类构造方法中的属性,可以有以下几种写法:ParentObject.__init__(self,height="115cm")super().__init__(height="115cm")super(ChildObject, self).__init__(height="115cm")class ParentObject(object):      def __init__(self, height):         self.name = "当当"         self.age = 5         self.height = height      def parent_func(self):         print("这是父类中的方法")  class ChildObject(ParentObject):     def __init__(self):         # ParentObject.__init__(self,height="115cm")  # 子类继承父类的构造方法,写法一         super().__init__(height="115cm")  # 子类继承父类的构造方法,写法二         # super(ChildObject, self).__init__("115cm")  # 子类继承父类的构造方法,写法三3)类的多继承:深度优先和广度优先
  Python中一个子类可以继承多个父类,寻找方法有两种,分别是:深度优先(Python2)和广度优先(Python3)
  在Python2中,经典类遵循的是深度优先的原则,新式类遵循的是广度优先的原则;而在Python3中,无论是经典类还是新式类,都遵循广度优先class A(object):     name = "Asia"     def __init__(self):         print("class A")  class B(A):     def __init__(self):         print("class B")  class C(A):     def __init__(self):         print("class C")  class D(B, C):   # D类继承了B、C,会先从B类开始查找指定属性,B不存在时再从C开始查找,C也不存在时再从B的父类查找     def __init__(self):         print("class D")  obj = D() print(obj.name) # Asia
  由于D类继承了B、C,会先从B类开始查找name属性,B不存在,所以会再从C开始查找,由于C也不存在,所以会再从B的父类开始查找,最后在B的父类A中找到了name属性,打印结果为Asia。4)子类重写父类方法
  在子类中,使用与父类中相同的变量名或方法名,或重写父类的属性或方法class Parent:     def __init__(self):         self.name = "Lucy"      def fun_a(self):         print("this is a function in class Parent")  class Son(Parent):     def __init__(self):         super().__init__()         self.name = "Tom"  # 子类重写父类属性      def fun_a(self):  # 子类重写父类方法         print("this is a function in class Son")  son = Son() print(son.name)  # Tom son.fun_a()  # this is a function in class Son3.多态
  不同的子类对象,调用相同的父类方法,产生不同的结果,一种事物的多种体现形式,函数的重写其实就是多态的一种体现class Animals(object):     def talk(self):         print("animals")  class Person(Animals):     def talk(self):         print("person")  class Cat(Animals):     def talk(self):         print("cat")  class Dog(Animals):     def talk(self):         print("dog")  Person().talk()  # person Cat().talk()  # cat Dog().talk()  # dog
  如上图所示,Person、Dog、Cat分别继承了Animals类,但是分别重写了talk方法,当这三个类分别被调用时会执行自己类中所定义的talk方法,而非父类Animals中的talk方法二、类变量、成员变量、局部变量1.类变量
  类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。可以由类名直接调用,也可由对象来调用。# 类变量 class A:     name = "Tony"      def fun_a(self):         print("this is a test function in class A")  print(A.name)  # Tony print(A().name)  # Tony2.实例变量(成员变量)
  在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的,在构造方法中以self. 开头来定义。实例变量只能通过对象来调用,不能通过类名调用。# 实例变量(成员变量) class B:     def __init__(self):         self.city = "suzhou"  # 实例变量         self.street = "松涛街"  # 实例变量         # 在构造方法中提前声明了一个方法,这个方法中所包含的变量也属于成员变量         self.vars()                def vars(self):         self.home = "月亮湾壹号"         self.house = "1幢一单元108"  print(B().city)  # suzhou print(B().street)  # 松涛街 print(B().__dict__)  # {"city": "suzhou", "street": "松涛街", "home": "月亮湾壹号", "house": "1幢一单元108"}3.局部变量
  定义在方法中的变量,只作用于当前实例的类。如以下方法中的mobile就属于局部变量。def info(self):     self.number = 227  # 局部变量     self.phone = 15252162666  # 局部变量三、类中私有方法和私有属性1.类的私有属性
  __private_attrs :两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs# 私有属性 class ParentObject(object):     mobile = 15252162666  # 类变量     __private_mobile = 15252162666  # 私有变量      def fun(self):         print("打印私有变量{}".format(self.__private_mobile))      def func(self):         return self.__fun()  po = ParentObject() po.fun()  # 打印私有变量152521626662.类的私有方法
  __private_method :两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methodsdef __fun(self):     print("这是一个私有化方法")  def func(self):     return self.__fun()3.外部调用类中的私有属性或方法
  通常私有属性和私有方法只能在类的内部被调用,外部是不可以调用的。但如果强行调用,也是可以的,相当于Python中开了个后门:
  外部调用类的私有属性:对象名._类名__属性名
  外部调用类的私有方法:对象名._类名__方法名# 外部调用类的私有属性:对象名._类名__属性名 print(po._ParentObject__private_mobile) # 外部调用类的私有方法:对象名._类名__方法名 po._ParentObject__fun()四、类的三类方法:实例方法、类方法、静态方法1.实例方法
  第一个参数必须是实例对象,该参数一般约定为self,通过它来传递实例的属性和方法(也可以传类的属性和方法),只能由实例对象调用  # 实例方法 class Example:     def fun_a(self):         print("这是一个实例方法")          # 调用实例方法,只能由实例对象调用 ex = Example() ex.fun_a()  # 这是一个实例方法2.类方法
  使用装饰器@classmethod,第一个参数必须是当前类对象,该参数名一般约定为"cls",通过它来传递类的属性和方法(不能传实例的属性和方法),类和实例对象都可以调用  @classmethod def fun_b(self):     print("这是一个类方法")      # 调用类方法,实例对象和类名都可以调用,使用类名直接调用时,不会执行类中的构造方法 ex.fun_b()  # 这是一个类方法 Example.fun_b()  # 这是一个类方法
  注:使用类名直接调用时,不会执行类中的构造方法  3.静态方法
  使用装饰器@staticmethod修饰,参数随意,没有"self"和"cls"参数,但是方法体中不能使用类或实例的任何属性和方法,一般用于和类本身无太多关联但又会绑定在类中的场景(不可使用类中的属性和方法),如获取时间等等。类和实例对象都可以调用  @staticmethod def fun_c():     print("这是一个静态方法")      # 调用静态方法,实例对象和类名都可以调用,不能使用类或实例的任何属性和方法 ex.fun_c()  # 这是一个静态方法 Example.fun_c()  # 这是一个静态方法小结
  类别
  调用方式
  注意事项
  类变量
  实例对象和类都可以调用
  实例变量(成员变量)
  只能通过实例对象调用
  局部变量
  只能在方法内部调用
  类的私有属性:__private_attrs
  只能在类的内部调用:self.__private_attrs
  外部强行调用类的私有属性:对象名._类名__属性名
  类的私有方法:__private_method
  只能在类的内部调用:self.__private_methods
  外部强行调用类的私有方法:对象名._类名__方法名
  实例方法
  只能由实例对象调用
  静态方法:@staticmethod
  实例对象和类都可以调用
  类方法:@classmethod
  实例对象和类都可以调用
  使用类名调用时,不会执行类中的构造方法

2023澳网斯瓦泰克不敌莱巴金娜止步女单16强北京时间1月22日,2023澳大利亚网球公开赛进入第7比赛日的争夺。罗德拉沃尔球场,女单赛会头号种子世界第一斯瓦泰克遭遇温网冠军莱巴金娜。结果莱巴金娜直落两盘以6464击败斯瓦泰克前国足核心将驰援南通支云,曾是中超冠军豪门队长,已官宣加盟日前,南通支云队官宣前国足王牌指挥官汪嵩加盟,这是让很多球迷都觉得非常意外的转会。因为,汪嵩已经即将跨入四十岁高龄球员行列。跟汪嵩同一批的老将,都相继选择退役。只有汪嵩还坚守在职业加兰我不想提昨天输给勇士很高兴我们重新打出了高水准直播吧1月22日讯骑士今日主场114102击败雄鹿,赛后,骑士后卫加兰接受采访时谈到了本场比赛。我们知道我们昨天对阵勇士时,没有发挥出自己最好的水平。我甚至不想谈论昨晚的事情,因为今年火了一种新年穿搭,叫长裙长靴,显瘦显高,真的太美了新年新气象,女生朋友们在新的一年里也会选择给自己买新的衣服,换新的发型去迎接这个新年,当然啦,在新年里想要穿出好气质,在单品的选择上和搭配上必然不能随意地去尝试那些不符合个人身材气陈好真是万人迷,穿羽毛袖上衣配半身裙,这样的43岁太美好女性之美来源于她的内心,而不是单纯依靠穿衣打扮,但是外在形象的塑造也是必不可少的,毕竟人靠衣装,佛靠金装,不懂得打扮自己的女人,也很难有效地释放出自身的魅力。尤其是对于40岁左右的芙蓉姐姐亮相北大,从屌丝丑女到优雅总裁,如今身价过亿!不管什么年龄,无论颜值的高低,懂得穿搭都非常重要。古人说靠衣裳马靠鞍,在中国自古以来,衣食住行,衣着一直都是排在第一,其重要性不言而喻。利用好穿搭来可以扬长避短,不仅能遮住自身的缺牛仔裤8个显胖显土的细节,看看你都踩了没作为经典且百搭的单品,一年四季中牛仔裤的利用率都非常高。不同款式不同搭配可以彰显出不同的气场,是经典与时髦的存在。很多人在穿牛仔裤的时候会显得土胖,实际上是因为没有注意这8个细节,买新衣过新年,松江服装市场迎来热销丨爱申活暖心春过年穿新衣是中国人的传统习俗,新春里,松江服装市场迎来热销。记者近日走访多家商超发现,服饰销量明显上升,其中中国红销量最佳。在大润发超市松江店,超市内的年节服饰种类不少,还推出了打章子怡嫂子殷旭,穿深V黑裙太狂野,薄纱点缀妩媚又吸睛头条创作挑战赛经典的小黑裙,自带高级气场。在各种场合中,小黑裙的出镜率都是非常高的。不管是素人,还是明星,都更加偏爱小黑裙。高级经典的色系,不仅显瘦显白,也完全避免了踩雷的可能。让春晚穿搭热搜!马丽羽绒服炸毛,宋轶露趾凉鞋抢镜,赵丽颖赢麻了大年三十晚上,春晚如约而至。经过了一轮轮筛选,最后能留在舞台上的女明星们,都卯足了劲儿,拿出了年度最养眼的穿搭,以最美好的面貌,陪全国人民过新年。都有哪些令人眼前一亮的造型,一起来19场25球!哈兰德帽子戏法超C罗前4赛季金靴,多项英超神迹诞生北京时间1月22日晚22点,英超第20轮继续进行,曼城坐镇伊蒂哈德球场迎战狼队。上半场哈兰德头球打破僵局,下半场哈兰德6分钟之内再入2球上演帽子戏法,曼城30轻松收获2连胜,距离榜
数据安全意义重大伴随着互联网的迅猛发展和数字经济的快速推进,全球数据呈现爆发增长海量集聚的特点,对经济发展社会治理国家管理人民生活都产生了重大影响。数据作为前沿技术开发隐私安全保护的重要内容,让数今年火了一种裤子叫酒杯裤,遮肉又显瘦,上衣随意搭都很洋气显瘦遮肉一贯以来都是爱美小姐姐们穿衣的基本要求,拥有一副好身材,比什么流行款式的衣服都重要。服装可以简单,但绝对不可以暴露身材缺点,更重要的,是需要具备打造好身材的优势,所以今年火唐闻生毛主席身边气质极佳的女翻译,最终却一生未婚毛主席身边有着一位气质极佳的女翻译,这位女翻译几乎参加了毛主席与来访各国政要的所有会见。她就是唐闻生,她努力向上,人生十分精彩,却始终未婚。在伟人面前的两次出糗就是这样一位几乎参与毛主席病逝前曾吃7两燕窝残渣,管家吴连登感慨朴素得让人心疼文文史档案局编辑文史档案局1975年,看到病房里虚弱的毛主席,吴连登以及一众工作人员都心疼不已。经过这段时间的治疗,他的身体仍然十分虚弱,已经无法独立进食,必须依靠鼻饲吸收营养。可历史上9月14日,丁汝昌开始统率北洋水师,创办昆明湖水师学堂1879年9月14日,旧历七月二十八。两江总督兼南洋大臣沈葆桢上奏,李鸿章代南洋水师订购的四艘炮艇即将抵达福建,分别命名为镇东镇西镇南镇北,拟请由赴英国学成回国的刘步蟾林泰曾何心川伊丽莎白女王去世后,英联邦解体已无可挽回?新西兰已率先表态随着伊丽莎白二世寿终正寝,有关英联邦解体的传言喧嚣尘上,事实上,就在伊丽莎莉白二世离世之后的第二天,远在加勒比海地区的英联邦国家,就已经在鼓动着脱英,其中,太平洋岛国安提瓜和巴布达刘国梁,有了新身份资料图新华社记者王东震摄刘国梁加入WTT世界乒联董事会WTT世界乒乓球职业大联盟(WTT世界乒联)26日宣布,任命现任WTT理事会主席刘国梁为董事会成员。WTT世界乒联表示,刘国梁1979年江西63岁老汉碰瓷军车,一首歌恢复党籍,他有何身份?在中国的革命史上,红军时期是一段极为艰难的时期,不少战士都在转移和征战中掉队了,想要找到这些老英雄,自然是需要下足功夫。肖成佳也经历了长征,遗憾的是他在后来的战斗中和部队失散,度过小鹏汽车前雇员竟然承认窃取苹果机密太不争气了令人尴尬运营商财经网郝紫艳文前不久,关于苹果前工程师承认跳槽小鹏汽车前窃取机密的消息曾一度冲上微博热搜,引起不少关注。近日,小鹏汽车正式发布关于苹果起诉前员工张小浪的声明,本次运营商财经就发现最佳半导体后,美国知名华人教授陈刚将远离美国联邦资助项目文观察者网齐倩2021年1月被捕随后遭受长达一年的调查今年1月被撤销指控转眼间,曾被美国司法部污蔑为中国间谍的麻省理工学院(MIT)教授美籍华人陈刚,远离舆论中心已经半年多了。美国搞笑男沈腾与真爱擦肩而过,娶了相恋12年女友一hr他出生不错,进入娱乐圈起点就比别人高。结束12年爱情长跑让他收获美满家庭,结婚后他却说如果不娶便是罪人。最近沈腾出演的独行月球让他和一起出演的老搭档马丽两人又火上了热搜。两人