◆ ◆ ◆ ◆ ◆
不懂对象?活该报错!
建立Python&数据分析交流群这么久以来,帮助了至少500+的Python学习爱好者。当然,不是我一个人的力量与功劳,要感谢群里来自各个大厂的热心群友。每当有问题出现,不爱闲聊的大佬总能一针见血地指出问题所在。一问一答,那股子好学的劲儿,深深感染了我。不过,由此我也发现:萌新们或者说小白们犯错的问题总是那么相似,一而再,再而三的犯同一个错误。有时候,真想顺着网线过去敲一下你们的脑袋——好让你明白,把你敲醒。话说回来,不正是因为刚学吗?!什么中英文不分了,什么大小写搞不清,还有属性和方法也傻傻分不清的。我思考了三天三夜,终于悟出了萌新们时长报错的根本原因——不懂面向对象是什么鬼?!更令人可笑的是,天天在用第三方库竟然还不知道我已经面向对象了。
""" 面向对象实例介绍 """
import pandas as pd
# 生成实例化对象df
df = pd.read_excel(r"data.xlsx")
isinstance(df,pd.DataFrame) # 结果:True
# 访问属性
df.columns
# 调用方法
df.describe()
Python曰:一切皆对象。实例是类的对象,类是类型的对象,对象是对象的对象,就连变量在Python中都是对象。傻傻搞不清楚~类是什么?!对象又是什么?!属性和方法又是啥?!啥啥啥?!如果你真的不懂或者不太熟悉这些知识点,这篇文章我建议你一定要收藏、在看加转发,并且细细品味3遍。其中道理,你品,你细品~
面向对象编程OOP
Python,是一门面向对象编程的高级语言,而且还具备垃圾回收机制,让我们的编程变得更加简单。不言而喻,面向对象编程思想是多么的重要。要想深刻地理解面向对象编程,我觉得三大特性必须掌握——封装、继承、多态。
封装
所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。。封装是面向对象的特征之一,是对象和类概念的主要特性。简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
继承
所谓继承指提供了同一类对象共性的处理方法,子类继承父类共性的东西。这样有利于代码的复用性,即子类拥有父类的方法。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。
多态
向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。
也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
(点击图片可放大观看)
(点击图片可放大观看)(点击图片可放大观看)
小栗子
# 举一个小栗子
class Python(Everything):
# 公有静态属性,由类名.属性或者实例名.属性访问
motto = "Life is short.I use Python."
# 私有静态属性,只能由类内部方法访问
__creator = '公众号:统计与数据分析实战'
def __init__(self,user,os,download_date = '2019-04-01'):
# 公有成员属性
self.user = user
self.os = os
# 私有成员属性,无法正常访问
self.__version = 'python-3.7.3'
self.download_date = download_date
def __repr__(self):
return 'I am %s,using %s' %(self.user,self.__version)
# 普通方法
def get_user(self):
return self.user
def get_version(self):
return self.__version
def get_creator(self):
return Python.__creator
# issubclass(clsA,clsB)可以用来检测clsA是否是clsB的子类
issubclass(Python,Everything) # True
# 类名访问公有静态属性
Python.motto # 'Life is short.I use Python.'
# 私有静态属性不能被正常访问
Python.__creator # AttributeError: type object 'Python' has no attribute '__creator'
py = Python('小样儿','win-7')
py # I am 小样儿,using python-3.7.3
# isinstance(ins,cls)可以用来检测ins是否是cls的实例化对象
isinstance(py,Python) # True
# 实例访问公有静态属性
py.motto # 'Life is short.I use Python.'
# 私有静态属性不能被正常访问
py.__creator # AttributeError: 'Python' object has no attribute '__creator'
# 私有静态属性,只能由类内部方法访问
py.get_creator() # '公众号:统计与数据分析实战'
py.user # '小样儿'
# 调用普通方法
py.get_user() # '小样儿'
# 修改公有成员属性
py.user = '严小样儿'
py.user # '严小样儿'
# 公有成员属性可以被任意修改,安全性极低
py.get_user() # '严小样儿'
# 私有成员属性,无法正常访问
py.__version # AttributeError: 'Python' object has no attribute '__version'
# 调用普通方法
py.get_version() # 'python-3.7.3'
# 修改私有成员属性(实际并不会生效)
py.__version = 'Python-2.7'
py.__version # 'Python-2.7'
# 私有成员属性不可以被任意修改,提高了安全性
py.get_version() # 'python-3.7.3'——修改并没有成功
那么,私有成员属性如何才能像公有成员属性一样可以被正常访问和修改呢?答案——加个装饰器!
# 加装饰器
class Python(Everything):
# 公有静态属性,由类名.属性或者实例名.属性访问
motto = "Life is short.I use Python."
# 私有静态属性,只能由类内部方法访问
__creator = '公众号:统计与数据分析实战'
def __init__(self,user,os,download_date = '2019-04-01'):
# 公有成员属性
self.user = user
self.os = os
# 私有成员属性,无法正常访问
self.__version = 'python-3.7.3'
self.download_date = download_date
def __repr__(self):
return 'I am %s,using %s' %(self.user,self.__version)
# 普通方法
def get_user(self):
return self.user
def get_version(self):
return self.__version
# getter装饰器
@property
def version(self):
return self.__version
# setter装饰器
@version.setter
def version(self,ver):
self.__version = ver
def get_creator(self):
return Python.__creator
# 使用getter装饰器,可以正常访问私有属性
py = Python('小样儿','win-7')
py.version # 'python-3.7.3'
py.get_version() # 'python-3.7.3'
# 使用setter装饰器,可以任意修改私有属性
py.version = '3.7.3'
py.version # '3.7.3'
py.get_version() # '3.7.3'——成功修改私有成员属性
==干货推荐==
某款APP用户注册信息有了,一起用Python数据分析实战吧
结束语
今天主要介绍了面向对象编程思想,实例和如何加装饰器来访问私有属性、修改私有属性。其实,有时候真的不知道大家到底卡在哪里?哪里出问题最多!接下来,还会有一篇关于面向对象编程的文章——哪吒大战三太子。当你彻底地掌握了面向对象编程,自己就可以写个脚本小游戏啦。索要源码的,请扫描下方二维码关注公众号,后台回复“微信”即可加微信领取,还可加群学习。