太好了,最全的Python面向对象入门教

北京看白癜风疗效好专科 http://pf.39.net/bdfrczy/140107/4323076.html

马上六一儿童节了,每当这天小朋友都可高兴啦!为啥呢?因为小朋友可以收到礼物啊,还可以给父母撒个娇提要求,美滋滋~~~~

还有一个特点就是:收到喜欢的礼物爱不释手,赶快藏起来了哈哈哈??

在我们面向对象的知识点里面,也有喜欢藏着的。那就是面向对象的“私有化”了。

私有化类本身就是一种封装,通过类可以将数据(属性)和行为(方法)相结合,形成一个有机的整体,也就是将数据与对数据的操作有机的结合。而我们程序的封装目的是:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。私有化可以理解成是更深层次的封装了,即只有类的内部方法才能访问私有化的属性和方法,通过正常的方式是无法访问对象的私有化属性和方法。Python不像Java一样使用关键字private声明一下,就是私有了,Python本身没有私有化这个概念,但是又想实现封装,那怎么办呢?只能“曲线救国”了即在属性和方法的前面添加__。为何称之为“曲线救国”,请大家一定要继续看下去就会明白了。我们通过代码理解一下私有化的定义

classChild:def__init__(self,name):self.name=name#非私有属性self.__toy=乐高#私有属性,在名字的前面添加了双下划线__#成员方法defsleep(self):print(我好困啊!我要睡觉....)#私有方法:就是在方法名字的前面添加双下划线__def__play_toy(self):print(f我的名字叫:{self.name}!我又可以玩我们的玩具啦!悄悄告诉你我的玩具是:{self.__toy})#创建对象c=Child(牛牛)print(c.name)c.sleep()#调用私有属性和方法会报错的print(c.__toy)#c.__play_toy()结果:其实这时候大家可能又有一个疑问????属性私有化之后对象就无法获取属性和修改属性值了,这个可怎么办?使用下面这种方式你会发现,不仅私有属性外部可以赋值,而且还可以对属性值进行一定的控制。

classChild:def__init__(self,name):self.name=name#非私有属性self.__toy=乐高#私有属性,在名字的前面添加了双下划线__#成员方法defsleep(self):print(我好困啊!我要睡觉....)#私有方法:就是在方法名字的前面添加双下划线__def__play_toy(self):print(f我的名字叫:{self.name}!我又可以玩我们的玩具啦!悄悄告诉你我的玩具是:{self.__toy})#定义公有方法获取私有属性defget_toy(self):returnself.__toy#定义公有方法对私有属性进行设置defset_toy(self,toy):security_toys=[乐高,芭比娃娃,毛绒玩具]iftoyinsecurity_toys:self.__toy=toy#因为赋值成功,所以在调用__play_toy的时候就会获取最新赋值后的玩具名称self.__play_toy()else:print(小朋友其他玩具不安全哦!)#创建对象c=Child(牛牛)print(c.get_toy())c.set_toy(芭比娃娃)print(c.get_toy())c.sleep()结果:通过上面我们发现,对象就可以私有属性访问私有属性了,而私有方法只能在类的内部访问。为什么说是"曲线救国"呢?我们打印一下对象的所有信息通过dir()

#在上面代码的基础上print(dir(c))#c为上面??代码的对象c发现并不存在__toy和__play_toy这两个私有的属性和方法,而发现了上图红线标注的两个。同时name,get_toy,set_toy,sleep等也都在里面。其实是Python解释器在你运行的时候悄悄的做了"手脚",默认在私有的前面加上了的前缀。所以外界的对象就无法访问到了。如果外界对象通过

print(c._Child__play_toy)就可以打印内容了试一试吧!当然我们一般不会这么用的,大家知晓即可

property当然Python也可以通过内置的装饰器property为“私有”属性提供读取和修改的方法,装饰器通常会放在类、函数或方法的声明之前,通过一个

符号表示将装饰器应用于类、函数或方法。

property最大的好处就是在类中把一个方法变成属性调用,起到既能检查属性,还能用属性的方式来访问该属性的值。装饰器的概念我们在函数部分给大家分享过在此就不再多说。

classChild:def__init__(self,name,age):self.__name=nameself.__age=age#属性访问器(getter方法)-获取__name属性

propertydefname(self):returnself.__name#属性修改器(setter方法)-修改__name属性

name.setterdefname(self,name):#如果name参数不为空就赋值给对象的__name属性#否则将__name属性赋值为无名氏,有两种写法#self.__name=nameifnameelse无名氏self.__name=nameor无名氏

propertydefage(self):returnself.__agec=Child(王二狗,20)print(c.name,c.age)c.name=print(c.name)c.age=22结果:注意:name(self)是get方法,用

property装饰,第二个name(self,name)是set方法,用

name.setter装饰,可以认为

name.setter是前一个

property装饰后的副产品。

property在后面也有用到,比如我们web开发有User类,所有的用户密码都是加密的,你不能获取密码查看,但是可以修改密码。这个就可以使用

property定义完成

#截取部分内容如下:#外界无法直接获取密码,或者报错

propertydefpassword(self):raiseAttributeError(passwordisnotareadableattribute)#修改密码则调用generate_password_hash方法对原始密码加密后赋值

password.setterdefpassword(self,password):self.password_hash=generate_password_hash(password)类方法和静态方法前面介绍了

property,知道

property是一个内置的装饰器,在Python面向对象这里还有两个装饰器:

staticmethod(静态方法)、

classmethod(类方法)。静态方法就是定义在类里的函数,并没有非要定义的必要;类方法则是在调用类属性、传递类对象时使用;来看一段代码:

classChild:__type="儿童"#类方法,用classmethod来进行修饰

classmethoddefget_type(cls):returncls.__typeprint(Child.get_type())一个方法用装饰器

classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数,而非self。使用场景:当方法中需要使用类对象(如访问私有类属性等)时,定义类方法类方法一般和类属性配合使用静态方法的代码:

classChild:type="儿童"def__init__(self):name=None#静态方法

staticmethoddefintroduce():#静态方法不会自动传递实例对象和类对象print("我是一位可爱的小baby.....")child=Child()child.introduce()#可以用实例对象来调用静态方法Child.introduce()#可以用类对象来调用静态方法因此静态方法的特点:需要通过装饰器

staticmethod来进行修饰,静态方法既不需要传递类对象也不需要传递实例对象(形参没有self/cls)。静态方法也能够通过实例对象和类对象去访问。

系列文章

第1天:Python环境搭建指南

第2天:PyCharm的安装与使用、变量与数据类型

第3天:Python类型转换、运算符、分支结构

第4天:if语句的多种形式和while循环

第5天:for循环与基础语法综合案例

第6天:一文清晰掌握Python字符串

第7天:Python基础:英雄联盟案例学习List

第8天:Python数据类型:元组和集合总结

第9天:Python字典详解

第10天:全网最全Python函数入门使用

第11天:Python函数的基本特征详解

第12天:理解Python中命名空间的查找规则LEGB

第13天:Python之列表推导式、迭代器、生成器

第14天:跟着赛亚人悟空学习面向对象基础

-END-Python专栏关于Python都在这里预览时标签不可点收录于话题#个上一篇下一篇

转载请注明:http://www.sonphie.com/lcbx/14474.html

  • 上一篇文章:
  • 下一篇文章: 没有了
  • 网站简介| 发布优势| 服务条款| 隐私保护| 广告合作| 网站地图| 版权申明

    当前时间: