python之封装和继承篇
# -*- coding: UTF-8 -*- #封装是面向对象的三大特性 # 封装指的是隐藏对象中的一些不希望被外部所访问到的属性或方法 # 如何去隐藏一个对象的属性? # -将对象的属性名,修改为一个外部不知道的名字 # 如何获取(修改)对象中的属性? # -需要提供一个getter和setter方法,使外部可以访问到属性 # - getter获取对象中指定属性(get_属性名) # - setter用来设置对象的指定属性(set_属性名) # 使用封装,确实是增加了类定义的复杂程度,但是他也确保了数据的安全性 # 1,隐藏了属性名,使调用者无法随意的修改对象中的属性 # 2,增加了getter和setter方法,很好的控制的属性是否只读的 # 如果希望属性是只读的,则可以直接去掉setter方法 # 如果希望属性是不能被外部访问,则可以直接去掉getter方法。 # 3, 使用setter方法设置属性,可以增加数据的验证,确保数据的值正确性。 # 4,使用getter方法获取属性,使用setter方法设置属性 # 可以在读取属性和修改属性的同时做一些其他处理 # 4, class Dog: def __init__(self, name, age): self.hidden_name = name self.hidden_age = age def say_hello(self): print("大家好,我是%s" % self.hidden_name) def get_name(self): return self.hidden_name def set_name(self, name): print("设置对象属性") self.hidden_name = name def get_age(self): print("获取对象属性") return self.hidden_age def set_age(self, age): if age > 0: print("设置对象属性") self.hidden_name = age d = Dog("旺财", 8) #d.say_hello() d.set_name("小黑") print(d.get_name())# -*- coding: UTF-8 -*- class Rectangle: def __init__(self, width, height): self.hidden_width = width self.hidden_height = height def get_width(self): return self.hidden_width def get_height(self): return self.hidden_height def set_width(self, width): self.hidden_width = width def set_height(self, height): self.hidden_height = height def get_area(self): return self.hidden_width * self.hidden_height # r = Rectangle(5, 2) # r.set_height(20) # r.set_width(10) # print(r.get_area()) #可以为对象的属性使用双下划线开头,__xxxx #双下划线开头的属性,是对象的隐藏属性,隐藏属性只能在类的内部访问,无法通过对象访问。 # 其实隐藏属性只不过是python自动为属性改了一个名字 # 其实上将名字改为了,__类名__属性名,比如 __name ---> _Person__name # class Person: # def __init__(self, name): # self.__name = name # # def get_name(self): # return self.__name # # def set_name(self, name): # self.__name = name # # p = Person("tom") # # print(p.__name) #__开头的属性时隐藏属性,无法通过对象访问 # # p.__name = "lili" # #p._Person__name = "lili" # # print(p.get_name()) #使用__开头的属性,实际上仍然可以在外部访问,所以这种方式我们一般不用 # 一般我们会将一些私有属性(不希望被外部访问的属性)以_开头 # 一般情况下,以_开头的属性都是私有属性,没有特性需求不要修改私有属性 class Person: def __init__(self, name): self._name = name def get_name(self): return self._name def set_name(self, name): self._name = name p = Person("孙悟空") print(p._name)# -*- coding: UTF-8 -*- class Person: def __init__(self, name, age): self._name = name self._age = age # property装饰器,用来将一个get方法,转换为对象的属性 # 添加为prperty装饰器以后,我们就可以将像调用属性一样使用get方法 @property def name(self): print("get方法执行") return self._name #setter方法的装饰器:@属性名.setter @name.setter def name(self, name): print("setter方法执行") self._name = name @property def age(self): print("get方法执行") return self._age #setter方法的装饰器:@属性名.setter @name.setter def age(self, age): print("setter方法执行") self._age = age p = Person("孙悟空", 28) p.name = "猪八戒" p.age = 23 print(p.name, p.age)# -*- coding: UTF-8 -*- #继承 #定义个类animal # 这个类中需要两个方法:run(), sleep() class Animal: def run(self): print("动物会跑…") def sleep(self): print("动物会睡觉") # def bark(self): # print() #定义一个类:Dog # 这个类中需要三个方法: run(),sleep(),bark() class Dog: def run(self): print("狗会跑…") def sleep(self): print("狗会睡觉") def bark(self): print("狗会叫") #有一个类,能够实现我们需要的大部分功能,但是不能实现我们的全部功能 #如何让这个类实现我们的全部功能呢 # 1,直接修改这个类,在这个类中添加我们的需要功能 # 修改起来比较麻烦,并且会违反OCP规则 # 2,直接创建一个新的类 # 创建一个新的类比较麻烦,并且需要大量的进行复制粘贴,导致大量重复性代码 # 3,直接从Animal类中来继承她的属性和方法 # 继承是面向对象的三大特性 # 通过继承我们可以使一个类获取到其他类中的属性和方法 # 在定义类时,可以在类名后的括号中指定当前类的父类(超类,基类,supper) # 子类(衍生类)可以直接继承父类汇总的所有的属性和方法 # 通过继承可以直接获取到父类的方法或属性,避免重复代码,并且也符合OCP规则 #所以我们经常需要通过经常对一个类进行扩展 class Dog(Animal): def bark(self): print("狗会叫") class Hashiqi(Dog): def fansha(self): print("我是一只傻傻的哈士奇") d = Dog() h = Hashiqi() h.fansha() d.run() d.sleep() d.bark() print(d) flag = isinstance(d, Dog) flag = isinstance(d, Animal) print(flag) #在创建类时,如果省略了父类,则默认父类为object # object是所有类的父类,所有都继承自object class Person(object): pass #issubclass() #检查一个类是否是另一个类的子类 print(issubclass(Animal, Dog)) print(issubclass(Dog, object)) print(issubclass(Person, object)) #isinstance()用来检查一个对象是否是一个类的实例 #如果这个类是这个对象的父类,也会返回true #所有对象都是object的实例 print(isinstance(Dog, object))
7大知名的搜索引擎,按受欢迎程度排序通常,营销人员在争夺流量时会非常关注谷歌。例如,我敢打赌,你的SEO会议主要围绕Google的主题展开,诸如我们的自然搜索怎么样?之类的问题。我们如何在Google上捕获第一页?我
今天主线已经清晰,新能源汽车板块大反弹即将开始今天大盘一扫往日的死气沉沉,大红灯笼高高挂,太阳又出来了。在这几天沉闷的调整中,各板块轮动迅速,找不到热点,找不到谁将引领主流,谁才是王者!从今天的市场来看,现在主线已经无比清楚,
牵手宝华韦健音响,能给峰米科技带来什么?近日,光峰科技(688007。SH)旗下子公司,激光投影行业领导者峰米科技宣布与世界级音响品牌BowersWilkins(以下简称宝华韦健)达成重磅合作,震撼发布搭载了宝华韦健原装
Linux之etcgroup文件用户组(Group)配置文件主要有etcgroup和etcgshadow,其中etcgshadow是etcgroup的加密信息文件。etcgroup文件作用etcgroup文件是用
手慢无索尼5。1声道回音壁2490元,发烧也够用了搜罗全网俏数码尖儿货,分享抢购经验,手把手教你羊毛如何薅,尽在ZOL全新栏目手慢无。近日京东年货节,索尼HTS40R5。1声道回音壁仅需2490元到手!刚需可入!索尼HTS40R回
Python的类和对象入门本文来说说Python中的类与对象,Python这门语言是无处不对象,如果你曾浅要了解过Python,你应该听过Python是一种面向对象编程的语言,所以你经常可能会看到面向对象编
零基础如何学习互联网营销?互联网营销在百度百科上的定义如下互联网营销也称为网络营销,就是以国际互联网络为基础,利用数字化的信息和网络媒体的交互性来实现营销目标的一种新型的市场营销方式。营销的最终目的是占领市
它们是我2021年用过最好的手机,可择机捡漏,不过价差很大又是一年该总结的时候了,睡前媳妇儿突然的一句今年你钱都花哪儿去了,不善言辞的我差点来了句,我现在是王者V10,还好床头柜上的几个手机盒给了圆场的答案。虽然各大手机品牌基本用了一圈,
为什么徕卡相机那么贵,动不动就几万,跟普通单反有什么区别?一个一个来回答你1。产量低,每件产品分摊的费用就特别大。这是最根本的原因。2。经典款徕卡M系列的测距系统非常复杂,其中上图最左侧的微型屋脊棱镜非常难加工。上图是日本勃朗尼卡RF的结
iPhone15或将全部搭载苹果自研芯片官方回应1工信部回复丁磊将制定国标促进充电接口融合统一作为全国政协委员,丁磊也曾向工信部荐言统一智能电子设备充电器标准端口,进一步减少电子垃圾助力碳中和。近日,工信部答复丁磊称,将
小米被印追缴65亿卢布,这个瓜该怎么吃?近期的印向小米追缴65亿卢布的事儿不知道大家看了没。居士认为,小米大概率会跟他们谈,最终的价格还是可以商量的,毕竟不谈的话,以后印的市场有没有还两说。同时,居士还认为,OV两厂大概