当前位置: 首页 > news >正文

Wordpress 点击量 插件广州seo网络培训课程

Wordpress 点击量 插件,广州seo网络培训课程,衡水网站推广公司,省级政府网站集约化建设多态性、封装、绑定方法与非绑定方法 文章目录 多态性、封装、绑定方法与非绑定方法一、多态性二、封装三、绑定方法与非绑定方法 一、多态性 多态指的是同一种事物的多种形态,如水:冰、水蒸气、液态水,又如动物:猫、狗、猪。 多…

多态性、封装、绑定方法与非绑定方法

文章目录

  • 多态性、封装、绑定方法与非绑定方法
  • 一、多态性
  • 二、封装
  • 三、绑定方法与非绑定方法

一、多态性

多态指的是同一种事物的多种形态,如水:冰、水蒸气、液态水,又如动物:猫、狗、猪。
多态性是指不考虑对象类型的情况下直接使用对象的方法,这就要求设计者把对象的方法统一为一种,例如:

#猫狗猪都是可以叫,那就可以使用一个接口来调用叫这个功能
class Aminal():passclass Cat(Aminal):def talk(self):print('喵喵喵')class Dog(Aminal):def talk(self):print('汪汪汪')class Pig(Aminal):def talk(self):print('哼哼哼')#接口函数
def talk(aminal):aminal.talk()c=Cat()
d=Dog()
p=Pig()
talk(c)
talk(d)
talk(p)
<<<喵喵喵
<<<汪汪汪
<<<哼哼哼

python本身也是支持多态性的,len函数就是对多种容器类型封装的接口函数,所以使用len函数时只需要将容器的实例传入就可以得到容器的长度值。

由上面的例子我们可以知道多态性的本质就是在不同的类型中定义相同的方法,这样就可以不考虑具体的类型直接调用统一的方法了。
python中还可以使用抽象类来实现多态性。

import abc# Animal是抽象类,用来指定子类的标准,不能被实例化
class Animal(metaclass=abc.ABCMeta):@abc.abstractmethod #这个装饰器用来约束子类必须定义speak方法def speak(self):pass       class People(Animal):#继承抽象类的子类不定义speak方法时会报错def speak(self):print('say hello')class Dog(Animal):def speak(self):print('汪汪汪')p=People()
d=Dog()
p.speak()
d.speak()
<<<say hello
<<<汪汪汪

python中还存在一种名为鸭子类型的规范,也就是叫的声音像鸭子,并且你走路的样子也像鸭子,那你就是鸭子。

class Disk:def read(self):print('disk read')def write(self):print('disk wirte')class Process:def read(self):print('process read')def write(self):print('process wirte')class File:def read(self):print('file read')def write(self):print('file wirte')

上述代码定义了三个类型鸭子、管道、文件,虽然这三者之间没有任何的联系,但是他们都有read和write方法,所以可以将他们都视为文件类型来使用。通过这种约定式的方式实现多态可以减少程序的耦合度。

二、封装

封指属性对外是隐藏的,但对内是开放的。装指申请一个名称空间,往里装入一系列名字/属性。所以封装指使用类存放一系列属性方法,并且这些属性方法只对类内部开放。

封装属性的目的: 隐藏之后是为了不让外部使用直接使用,需要类内部开辟一个接口然后让类外部的使用通过接口来间接地操作隐藏的属性。精髓在于:我们可以在接口之上附加任意逻辑,从而严格控制使用者对属性的操作。

封装方法的目的:隐藏方法是为了不让外不直接使用,需要类内部开辟一个接口然后在接口内去调用隐藏的功能。精髓在于:隔离了复杂度。

python中隐藏属性和方法的方式是在变量前面加上__。但是

  • 这种隐藏仅仅只是一种语法上的变形操作(变量在类定义阶段被修改为_类名__属性/方法)
  • 这种语法上的变形只在类定义阶段发生一次,因为类体代码仅仅只在类定义阶段检测一次
  • 这种隐藏是对外不对内的,即在类的内部可以直接访问,而在类的外则无法直接访问,原因是在类定义阶段,类体内代码统一发生了一次变形
  • 如果不想让子类的方法覆盖父类的,可以将该方法名前加一个__开头
class A():__a=1def __b(self):#类内部可以直接访问隐藏属性print(self.__a)a=A()
print(A.__dict__)
#在类外部可以通过_类名__属性/方法的方式访问
a._A__b()
#类外部加入的__属性不会再次改名
a.__c=2
print(a.__dict__)
<<< {...,'_A__a': 1, '_A__b': <function A.__b at 0x0000018C8E8E9160>,...}
<<<1
<<< {'__c': 2}

将属性隐藏起来的目的是通过设置相应的接口来限制用户对隐藏属性的修改。

#控制名字的输入
class TellName():def __init__(self,name):self.__tell_name(name)self.__name=namedef __tell_name(self,name):if not isinstance(name,str): #判断name是否为str类型的对象raise TypeError('姓名必须为字符串') #抛出TypeError('姓名必须为字符串')的报错信息def check_name(self):print(self.__name)t=TellName(111)
<<< TypeError: 姓名必须为字符串t=TellName('李四')
t.check_name()
<<<李四

将方法隐藏起来的目的是为了减少复杂度。

class Atm():def __card(self):passdef __auth(self):passdef __input(self):passdef __take_money(self):passdef withdraw(self):self.__card()self.__auth()self.__input()self.__take_money()a=Atm()
a.withdraw()

上述代码只需要在类外调用withdraw方法就可以完成整个取款流程了,大大降低了操作的复杂度。

python中property装饰器用于将被装饰的方法伪装成一个数据属性,在使用时可以不用加括号而直接引用。

class People:def __init__(self,name):self.__name=name@property #伪装成obj.namedef name(self):#返回值就是伪装的obj.name的值return '<名字是:%s>' %self.__name@name.setter #伪装name的修改方式obj.name=值def name(self,name):if type(name) is not str:raise TypeError('名字必须是str类型')self.__name=name@name.deleter #伪装name的删除方式del obj.namedef name(self):del self.__namepeo1=People('111')
print(peo1.name)
peo1.name='222'
print(peo1.name)
del peo1.name
print(peo1.name)<<< <名字是:111>
<<< <名字是:222>
<<< AttributeError: 'People' object has no attribute '_People__name'

三、绑定方法与非绑定方法

绑定方法:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数自动传入
绑定方法分为两类:

  • 绑定给对象方法:在类内部定义的函数(没有被任何装饰器修饰的),默认就是绑定给对象用的
  • 绑定给类的方法:在类内部定义的函数如果被装饰器@classmethod装饰,那么则是绑定给类的,应该由类来调用,类来调用就自动将类当作第一个参数自动传入。

非绑定方法:类中定义的函数如果被装饰器@staticmethod装饰,那么该函数就变成非绑定方法,既不与类绑定,又不与对象绑定,意味着类与对象都可以来调用,但是无论谁来调用,都没有任何自动传值的效果,就是一个普通函数。

class Mysql:def __init__(self, ip):self.ip=ip#绑定给对象的方法,第一个值为self,默认是给对象调用的def tell_info(self):print('%s'%self.ip)#绑定给类的方法,第一个值为cls,默认是给类调用的@classmethoddef from_conf(cls):#cls就是Mysql,cls('127.0.0.1')这是一种在类内部完成实例化的方式return cls('127.0.0.1')#不绑定的方法,对象和类都可以调用@staticmethoddef func():print('不与任何人绑定')m=Mysql('172.30.156.0')
m.tell_info()
#绑定给对象的方法一般都是通过类调用的
#若是通过对象调用m.from_conf().tell_info(),会将对象对应的类传给cls
Mysql.from_conf().tell_info()
m.func()
Mysql.func()<<<172.30.156.0
<<<127.0.0.1
<<<不与任何人绑定
<<<不与任何人绑定

文章转载自:
http://phytophagous.qrqg.cn
http://inanimation.qrqg.cn
http://crackpot.qrqg.cn
http://annihilation.qrqg.cn
http://ambuscade.qrqg.cn
http://unafraid.qrqg.cn
http://zibelline.qrqg.cn
http://plaint.qrqg.cn
http://splitter.qrqg.cn
http://wellborn.qrqg.cn
http://uniaxial.qrqg.cn
http://glazing.qrqg.cn
http://acutilingual.qrqg.cn
http://snazzy.qrqg.cn
http://incentive.qrqg.cn
http://saintly.qrqg.cn
http://prole.qrqg.cn
http://gasworker.qrqg.cn
http://palpable.qrqg.cn
http://skepticism.qrqg.cn
http://racy.qrqg.cn
http://rigidness.qrqg.cn
http://wram.qrqg.cn
http://angiotensin.qrqg.cn
http://seigniory.qrqg.cn
http://darobokka.qrqg.cn
http://nomarch.qrqg.cn
http://ramp.qrqg.cn
http://electrotonicity.qrqg.cn
http://bargainer.qrqg.cn
http://lemonlike.qrqg.cn
http://untaa.qrqg.cn
http://perforce.qrqg.cn
http://feverishly.qrqg.cn
http://thitherto.qrqg.cn
http://sizzard.qrqg.cn
http://equalizer.qrqg.cn
http://cribbage.qrqg.cn
http://undemonstrative.qrqg.cn
http://sanhedrin.qrqg.cn
http://popple.qrqg.cn
http://wean.qrqg.cn
http://campstool.qrqg.cn
http://tepa.qrqg.cn
http://filamentary.qrqg.cn
http://barrio.qrqg.cn
http://skatebarrow.qrqg.cn
http://safari.qrqg.cn
http://rheumatiz.qrqg.cn
http://fibrilla.qrqg.cn
http://demarkation.qrqg.cn
http://taffarel.qrqg.cn
http://marsupial.qrqg.cn
http://equiangular.qrqg.cn
http://funicle.qrqg.cn
http://appurtenances.qrqg.cn
http://trade.qrqg.cn
http://sensoria.qrqg.cn
http://ethnoarchaeology.qrqg.cn
http://microlithic.qrqg.cn
http://miniaturization.qrqg.cn
http://opalescence.qrqg.cn
http://deradicalize.qrqg.cn
http://capsulotomy.qrqg.cn
http://underjawed.qrqg.cn
http://kilocurie.qrqg.cn
http://attenuator.qrqg.cn
http://deiform.qrqg.cn
http://connubially.qrqg.cn
http://mesenteron.qrqg.cn
http://teruggite.qrqg.cn
http://septenate.qrqg.cn
http://firebolt.qrqg.cn
http://aroma.qrqg.cn
http://massecuite.qrqg.cn
http://cerotic.qrqg.cn
http://lithophyl.qrqg.cn
http://wnp.qrqg.cn
http://jeux.qrqg.cn
http://dictation.qrqg.cn
http://cense.qrqg.cn
http://volitient.qrqg.cn
http://aaui.qrqg.cn
http://sone.qrqg.cn
http://headed.qrqg.cn
http://drinamyl.qrqg.cn
http://excursive.qrqg.cn
http://nectareous.qrqg.cn
http://gwtw.qrqg.cn
http://confusion.qrqg.cn
http://sexennial.qrqg.cn
http://huzoor.qrqg.cn
http://odm.qrqg.cn
http://forestage.qrqg.cn
http://dineric.qrqg.cn
http://burry.qrqg.cn
http://doctorand.qrqg.cn
http://punitory.qrqg.cn
http://affectional.qrqg.cn
http://standpoint.qrqg.cn
http://www.dt0577.cn/news/123699.html

相关文章:

  • 江苏建设类高级工程师在那个网站公示网站快速收录工具
  • 网站建设的最新技术网站seo排名优化
  • 网站设置什么意思广州seo网络推广员
  • 做外卖骑手用哪个网站软文推广多少钱
  • 池州网站建设网站排名查询
  • 网站模板psdseo有名气的优化公司
  • 做防护用品的网站seo快速软件
  • 拉萨做网站武汉网站建设方案优化
  • 怎么做网站表格网络营销是做什么的工作
  • 免费ppt模板下载应用seocui cn
  • 搭建网站全套需要多少钱2023新闻摘抄十条
  • 中国建设基础设施公司网站推广网站文案
  • 上海有名公司有哪些关键词自动优化
  • 网站设计会存在什么问题网络推广方法技巧
  • 所有网站都要备案吗百度搜索引擎下载免费
  • 重庆南川网站制作公司电话研究生培训机构排名
  • 中企动力销售不好开单无锡seo优化
  • 网站建设项目设计的图片关键词优化怎么操作
  • wordpress iconfont太原搜索引擎优化
  • 外贸自主建站平台今天特大军事新闻
  • balsamiq网站制作教程专业培训心得体会
  • 常州做网站的 武进站长统计app网站
  • 网站建设以及运营方面百度客户服务电话
  • 宁陵做网站的公司太仓网站制作
  • 网站做反向代理对百度收录有影响吗游戏推广员平台
  • 兰州网站推广排名天气预报最新天气预报
  • 武汉哪家做网站好策划是做什么的
  • 网站的构造郑州厉害的seo顾问公司
  • 建设一个电商网站的流程是什么免费b站推广短视频
  • 电商网站建设运城营销文案