概述
很多人接触Python,都是从爬虫开始,其实很多语言都可以做爬虫,只是Python相对其他语言来说,更加简单而已。但是Python并不止于爬虫,在人工智能,科学计算等方面的应用更加广泛。古人云:万丈高楼平地起,要想有长足的发展,打好基础很重要,本文主要讲解Python的面向对象相关知识,仅供学习分享使用,如有不足之处,还请指正。
面向对象的特征
类:用来描述相同事物的特征的集合,如:Person 类,表示人,具有人的属性和特征。
对象:通过类定义的具体的实例,如:zhangsan 表示一个具体的人。
继承:是指派生类继承基类的方法和属性,并具有自己属性和特征,如:Man是Person的子类。
封装:隐藏数据和实现细节,提供对外访问方法。
多态:一个基类,可以有多个派生类,可以有不同的形态。
抽象:抛开细节,只关注本质特征的过程。
以上是面向对象的基本特征,那么Python在面向对象方面是如何做的呢?
创建类
如下所示:
- 使用 class 语句来创建一个新类,class 之后为类的名称并以冒号结尾。
- Python的类,没有大括号表示类的内容范围,而是通过缩进来实现。
- 类的成员方法和普通方法的区别是,方法定义的第一个参数是self,表示类的实例,但在调用时不需要。
- 其中__init__方法为类的初始化方法,当声明对象时,会调用对应的方法。
- 其中__del__方法为析构函数,当类被释放时调用。
class Employee: """员工类""" emp_count = 0 # 变量是一个类变量,它的值将在这个类的所有实例之间共享 def __init__(self, name, salary): """初始化""" self.name = name self.salary = salary Employee.emp_count += 1 def display_count(self): """显示数量""" print('Total Employee =', Employee.emp_count) def display_employee(self): """显示信息""" print('name =', self.name, ', salary = ', self.salary) def prt(self): """打印自己""" print(self) print(self.__class__) def __del__(self): """析构函数""" print(self, '被释放了')
创建对象
Python创建对象,不需要new关键字,类似于函数的调用,和Java及.Net不同。如下所示:
'创建第一个对象' emp = Employee('Jack', 20) emp.display_count() emp.display_employee() emp.prt()
动态添加与删除对象属性
对象的属性可以动态添加,这点与编译型语言不同,如下所示:
emp.age = 17 # 添加一个 'age' 属性 emp.age = 28 # 修改 'age' 属性 del emp.age # 删除 'age' 属性
也可以通过Python的内置方法来添加和获取属性,如下所示:
print(getattr(emp, 'name')) # 获取属性 print(hasattr(emp, 'age')) # 是否包含属性 setattr(emp, 'age', 18) # 设置属性和值 print(hasattr(emp, 'age')) # 是否包含属性 print(getattr(emp, 'age')) # 获取属性 delattr(emp, 'age') # 删除属性 print(hasattr(emp, 'age')) # 是否包含属性
Python也有内置类的一些属性,如下所示:
# 内置对象 print("Employee.__doc__:", Employee.__doc__) print("Employee.__name__:", Employee.__name__) print("Employee.__module__:", Employee.__module__) print("Employee.__bases__:", Employee.__bases__) print("Employee.__dict__:", Employee.__dict__)
类的属性与方法
- 类的私有属性,以双下划线开头,只可以在类内部通过self进行访问。
- 类的protected属性,以下划线开头,只允许子类和自身调用。
- 在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数
- 类的私有方法:以两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methods
如下所示:
class JustCounter: """类描述""" __secretCount = 0 # 类的私有变量 publicCount = 0 # 公开变量 def count(self): self.__secretCount += 1 self.publicCount += 1 print('私有变量:', self.__secretCount)
Python不允许实例化的类访问私有数据,但你可以使用 object._className__attrName( 对象名._类名__私有属性名 )访问属性,如下所示:
print(counter._JustCounter__secretCount)
类的继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。
- Python中的继承通过 class 子类名(父类名): 的格式实现。
- 子类可以调用父类的方法和定义自己的方法。
- 如果父类方法的功能不能满足需求,子类可以重写(overrides)父类的方法。
如下所示:Parent表示一个父类,拥有自己的属性和方法。
class Parent: """定义父类""" parentAttr = 100 def __init__(self): print('调用父类的构造函数') def parentMethod(self): print('调用父类方法') def setAttr(self, attr): Parent.parentAttr = attr def getAttr(self): print('父类属性:', Parent.parentAttr) def myMethod(self): print('我是父类的MyMethod')
Child表示一个子类,继承自Parent,如下所示:
class Child(Parent): """定义子类""" def __init__(self): print('调用子类的构造方法') def childMethod(self): print('调用子类方法') def myMethod(self): """重写Overrides父类方法""" print('我是子类的MyMethod') def __str__(self): """重写方法,适合人阅读""" return 'str方法返回'
子类的实例化
如下所示:
c = Child() # 实例化子类对象 c.childMethod() # 调用子类方法 c.parentMethod() # 调用父类方法 c.setAttr(200) # 再次调用父类方法,设置属性 c.getAttr() # 再次调用父类方法 获取属性 c.myMethod() # 调用的是子类的MyMethod
可以通过内置函数,判断子类与类的关系,如下所示:
print(issubclass(Child, Parent)) # 判断是否是对应的父子关系 print(isinstance(c, Child)) # 判断是否是实例对象 print(isinstance(c, Parent)) # 判断是否是实例对象
以上就是浅析Python面向对象编程的详细内容,更多关于Python面向对象编程的资料请关注其它相关文章!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】