日常前言
哈哈哈,我猜你是被标题骗进来的!,但是我并不是标题党,真真真的来用Python找个对象,只不过这个对象嘛,大家都懂的,当然是Class和self这两个面向对象编程的东西,初学Python的时候学了一点,做了的笔记,敷衍了事,之后便再也没用过了-_-!!
当后来建立博客网站的时候,1000多行代码全部挤到一个文件、各种变量重名、各种bug,才知道Class的好处
- 由于Class之后会占用一个缩进,所以结构清晰
- 独有的self,让局部变量被限制在当前的实例类中,不污染全局变量
- 通过继承,可使代码量大大减少
接下来,我会把我全部知道的关于面向对象编程的知识通过通俗易通的方式讲述出来,请大家放心阅读!
声明:
码代码也有一年的多的时间了,由于是学生的关系,平时就用Python玩下爬虫、树莓派和维护自己博客,也没做过什么大的项目,所以代码的结构写的也是比较简单,常用的也只是像def
、if/elif/else
、return
这样的普通小函数。
如果处于是小白阶段,不是非要写什么大的项目的话,其实Class这个函数真的真的真的不用看,也看不进去,比如我…目前所学的已经足够使用了
基本结构
>>> class Messy:
def __init__(self):
self.test = '这是测试字符串!'
def testFun(self):
print(self.test)
>>> Messy().test_fun()
这是测试字符串!
Messy:
类名,大写开头命名
__init__:
一旦定义了,在执行类名的时候,如Messy()
,类名里的__init__
也会一起执行
self:
类中的函数必须使用它作为第一个参数
**注意:**在类里面定义的变量名和函数名不能重名,不然冲突了会报错!
self
到底是什么?有什么好处?
他是一个类对象,以字典形式存储对象
>>> print(self.__dict__)
>>> {'testStr': '这是测试字符串!'}
__dict__:
查看当前类里面的所有以self.*
命名的变量名和函数名(在类里直接通过a=2
这样形式赋值的不包含)
**他的好处:**作为一个局部变量,当时是无法污染全局变量的啦
当然,如果学过前端的Js,应该知道this这个困扰广大程序猿的函数,其实python的self就跟js的this很像,都是指向的当前实例。另外,Js中也有self函数,但是他指向的是窗口实例(window),如window.onload可替换为self.onload。
继承
>>> class One:
def __init__(self):
self.testStr = '这是测试字符串!'
def oneFun(self):
print(self.testStr)
>>> class Two:
def twoFun(self):
print('two')
>>> class Main(One,Two):
pass
>>> Main().oneFun()
>>> 这是测试字符串!
>>> Main().twoFun()
>>> two
上面的代码是一个常规的继承结构,可以通过class Main(继承的类名,类名二)
来获取之前定义好的函数,大大减少代码量。下面
Main.__bases__ += (One,)
Main.oneFun()
Main.__bases__ += (A, B, ) # 多继承直接在逗号后加入类名即可
继承之后的重写函数
在继承了上个函数后,可能会遇到需要重构其中一个函数的情况,这个时候,直接def 需要重写的函数名
即可,e.g:
>>> class Messy:
def __init__(self):
self.testStr = '这是测试字符串!'
def messy(self):
print(self.__dict__)
print(self.testStr)
>>> class MessyNew(Messy):
def messy(self):
print('asd')
>>> Messy().messy()
>>> 这是测试字符串!
>>> MessyNew().messy()
>>> asd
前后双下划线、前单下划线、前双下划线分别代表什么?
__Messy__:
定义的是特殊方法,一般是系统定义名字 ,类似 init() 之类的。
_Messy:
只允许自己和子对象访问,如不能使用from test import Messy
__Messy:
只允许当前类访问,外部访问需要使用Test._Test__Messy
的方式
本文作者: Messy
原文链接:https://www.messys.top/detail/26
版权声明: 本博客所有文章除特别声明外, 均采用 CC BY-NC-SA 4.0 许可协议. 转载请注明出处!