首页 / PYTHON / Python面向对象的知识总结
Python面向对象的知识总结
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python面向对象的知识总结,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3090字,纯文字阅读大概需要5分钟。
内容图文
![Python面向对象的知识总结](/upload/InfoBanner/zyjiaocheng/431/003036812a224a5f8c11088419589912.jpg)
1.为什么要封装?
封装就是要把数据属性和方法的具体实现细节隐藏起来,只提供一个接口。封装可以不用关心对象是如何构建的
2.封装包括数据的封装和函数的封装,数据的封装是为了保护隐私,函数的封装是为了隔离复杂度
3.数据的封装就是在属性前面加一个__
class People:def __init__(self,name,age,salary): self.name=name self.age=age self.__salary=salary p=People('zhang',19,100000)print(p.name)#zhangprint(p.age)#19print(p.__salary)#AttributeError: 'People' object has no attribute '__salary'
咦,报错了,让我们打开对象的名称空间,看看发生了什么
print(p.__dict__)#{'name': 'zhang', 'age': 19, '_People__salary': 100000}
哦,原来python把__salary变形成了_People__salary,再来一遍
print(p._People__salary)#100000
所以,Python中并没有绝对的隐藏,只要你知道了上面这个,就无所谓隐藏了
这些变形操作,只在类的定义阶段或者对象定义(实例化阶段)阶段发生
虽然在外部无法直接访问加了__的属性,但是在类内部可以访问到,可以这么理解,在定义阶段,只要遇到__开头的,Python解释器自动识别为_类名__属性,所以在类内部是可以访问到的,这样的话,我们就可以搞一点小事情了
先来看这个
class A:def foo(self):print('from A foo') self.bar()def bar(self):print('from A bar')class B(A):def bar(self):print('from B bar') b=B() b.foo() #from A foo
#from B bar 别想多了,调用函数时别看定义位置,要看调用位置
如果就是想调用父类的bar()函数呢?该怎么做
class A:def foo(self):print('from A foo') self.__bar()def __bar(self):print('from A bar')class B(A):def __bar(self):print('from B bar') b=B() b.foo() #from A foo#from A bar 有没有感受到编程的享受
4.封装的应用
1)不让外界看到我们的数据属性是怎么定义的,只能通过我们提供的接口,看到我们允许外界看到的内容
class People:def __init__(self,name,age,height,weight,hobby): self.__name=name self.__age=age self.__height=height self.__weight=weight self._hobby=hobbydef tell_info(self):print('''name:%s age:%s height:%s weeight:%s'''%(self.__name,self.__age, self.__height,self.__weight)) p=People('zhang',18,1.90,75,'read') p.tell_info()
2)更常用的场景是,我们可以限制数据的类型,添加自己的逻辑以后再封装好给用户
def tell_name(self):print(self.__name)#修改名字def set_name(self,new):if not isinstance(new,str):raise TypeError('名字必须是字符串类型') self.__name=new
5.看我们上面的操作,用户查看名字的时候还得p.tell_name(),本来是个数据属性,却被我们搞得变成了一个函数,怎么伪装一下呢,就可以用到property这个内置函数了
class People:def __init__(self,name,age,height,weight,hobby): self.__name=name self.__age=age self.__height=height self.__weight=weight self._hobby=hobby @propertydef name(self):return self.__namep=People('zhang',18,1.90,75,'read')print(p.name)#zhang
数据属性还应该有修改,删除操作
@propertydef name(self):return self.__name#name已经被property修饰过,就有setter和deleter @name.setterdef name(self,new):if not isinstance(new,str):raise TypeError('名字必须是字符串类型') self.__name=new @name.deleterdef name(self):del self.__namep = People('zhang', 18, 1.90, 75, 'read')print(p.name)#zhangp.name='can' #修改print(p.name)#candel p.name #删除print(p.name)#AttributeError: 'People' object has no attribute '_People__name'
以上就是Python面向对象的知识总结的详细内容,更多请关注Gxl网其它相关文章!
内容总结
以上是互联网集市为您收集整理的Python面向对象的知识总结全部内容,希望文章能够帮你解决Python面向对象的知识总结所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。