深入浅析Python的类


Posted in Python onJune 22, 2018

面向对象编程时,都会遇到一个概念,类,python也有这个概念,下面我们通过代码来深入了解下。

创建和使用类

class Dog():
  def __init__(self, name, age):
    self.name = name
    self.age = age
  def sit(self):
    print(self.name.title() + " is now sitting.")
  def roll_over(self):
    print(self.name.title() + " rolled over!")
 
my_dog = Dog('willie', 6)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
 
运行结果:
My dog's name is Willie.
My dog is 6 years old.

class关键字:来定义一个类。类名通常首字母为大写。

__init__方法:特殊方法,每当实例类的时候都会运行。其中的形参self必不可少,而且必须位于最前面。

self形参:类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候

用不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身。

实例的方法是指定类名以及需要传入的实参。

要访问实例的属性或者调用方法,可使用句点表示法。

使用类和实例

class Car():
  def __init__(self, make, model, year):
    self.make = make
    self.model = model
    self.year = year
    self.odometer_reading = 0 #<- here
 
  def get_descriptive_name(self):
    long_name = str(self.year) + ' ' + self.make + ' ' + self.model
    return long_name.title()
 
  def read_odometer(self):
    print("This car has " + str(self.odometer_reading) + " miles on it.")
 
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
 
运行结果:
2016 Audi A4

可以看到,我们给Car类的属性指定了默认值self.odometer_reading = 0。如果要修改它,我们可以通过实例直接访问它并修改,比如:my_new_car.odometer_reading = 23。或者通过方法修改属性的值。或者通过方法对属性的值进行递增。

class Car():
  --snip--
  #通过方法修改属性的值
  def update_odometer(self, mileage):
    self.odometer_reading = mileage
 
  #通过方法对属性的值进行递增
  def increment_odometer(self, miles):
    self.odometer_reading += miles

继承

一个类继承另一个类时,他将自动获得另一个类的所有属性和方法;原有的类称为父类,新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

现在我们有一个Car类如下

class Car():
  def __init__(self, make, model, year):
    self.make = make
    self.model = model
    self.year = year
    self.odometer_reading = 0 #<- here
 
  def get_descriptive_name(self):
    long_name = str(self.year) + ' ' + self.make + ' ' + self.model
    return long_name.title()
 
  def read_odometer(self):
    print("This car has " + str(self.odometer_reading) + " miles on it.")
 
  def update_odometer(self, mileage):
    self.odometer_reading = mileage
 
  def increment_odometer(self, miles):
    self.odometer_reading += miles

创建子类实例时,python首先给父类所有属性赋值。

接下来我们创建新类EleCar

class Car():
  --snip--
 
class ElectricCar(Car):
  def __init__(self, make, model, year):
    super().__init__(make, model, year)
 
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
 
运行结果:
2016 Tesla Model S

首先父类必须位于子类前面。

super()是一个特殊函数,将父类和子类关联起来。使得可调用子类的父类的方法__init__(),让子类包父类的所有属性。

给子类定义属性和方法没有任何限制,比如:

class Car():
  --snip--
 
class ElectricCar(Car):
  def __init__(self, make, model, year):
    super().__init__(make, model, year)
    self.battery_size = 70
 
  def describe_battery(self):
    print("This car has a " + str(self.battery_size) + "-kWh battery.")
 
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
 
运行结果:
2016 Tesla Model S
This car has a 70-kWh battery.

如果需要重写父类的方法,只需定义一个与重写的父类方法同名的方法即可。

python还可以使用其他类的实例作为自己类的属性。

导入类

类似函数,类也可以保存为.py文件形成模块从而进行导入。

导入单个类:

from model_name import class_name

导入一个模块的多个类:

from model_name import class_name1, class_name2

导入一个模块所有类:

from model_name import *

导入整个模块:

import model_name

还可以在一个模块中导入另一个模块

python标准库

其是一组模块。模块collections中有一个类OrderedDict。字典的键值对没有顺序,但是这个类几乎和字典相同,区别只在于记录了键值对的顺序。

from collections import OrderedDict
 
favorite_languages = OrderedDict()
 
favorite_languages['jen'] = 'python'
favorite_languages['sarah'] = 'c'
favorite_languages['edward'] = 'ruby'
favorite_languages['phil'] = 'python'
 
for name, language in favorite_languages.items():
  print(name.title() + "'s favorite language is " +
language.title() + ".")
 
运行结果:
Jen's favorite language is Python.
Sarah's favorite language is C.
Edward's favorite language is Ruby.
Phil's favorite language is Python.
Python 相关文章推荐
Python 26进制计算实现方法
May 28 Python
Python编程实现双击更新所有已安装python模块的方法
Jun 05 Python
Python 从subprocess运行的子进程中实时获取输出的例子
Aug 14 Python
Python 复平面绘图实例
Nov 21 Python
Pycharm小白级简单使用教程
Jan 08 Python
python使用paramiko实现ssh的功能详解
Mar 06 Python
解决pycharm不能自动补全第三方库的函数和属性问题
Mar 12 Python
python使用自定义钉钉机器人的示例代码
Jun 24 Python
python设置中文界面实例方法
Oct 27 Python
Python函数调用追踪实现代码
Nov 27 Python
Pytest中skip和skipif的具体使用方法
Jun 30 Python
使用pipenv管理python虚拟环境的全过程
Sep 25 Python
基于python绘制科赫雪花
Jun 22 #Python
python3读取csv和xlsx文件的实例
Jun 22 #Python
django admin 后台实现三级联动的示例代码
Jun 22 #Python
python使用turtle库与random库绘制雪花
Jun 22 #Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
Jun 22 #Python
Django Admin实现三级联动的示例代码(省市区)
Jun 22 #Python
详解python中的json和字典dict
Jun 22 #Python
You might like
destoon二次开发入门示例
2014/06/20 PHP
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
thinkPHP商城公告功能开发问题分析
2016/12/01 PHP
js加强的经典分页实例
2013/03/15 Javascript
网页广告中JS代码的信息监听示例
2014/04/02 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
jQuery实现自动滚动到页面顶端的方法
2015/05/22 Javascript
js去除浏览器默认底图的方法
2015/06/08 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
Bootstrap每天必学之标签页(Tab)插件
2020/08/09 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
EasyUI的doCellTip实现鼠标放到单元格上提示单元格内容
2016/08/24 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
Angular6 写一个简单的Select组件示例
2018/08/20 Javascript
vue中$nextTick的用法讲解
2019/01/17 Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
2019/03/19 Javascript
解决layui弹框失效的问题
2019/09/09 Javascript
浅谈如何优雅处理JavaScript异步错误
2019/11/12 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
python中合并两个文本文件并按照姓名首字母排序的例子
2014/04/25 Python
手把手教你pycharm专业版安装破解教程(linux版)
2019/09/26 Python
使用python从三个角度解决josephus问题的方法
2020/03/27 Python
Django中Q查询及Q()对象 F查询及F()对象用法
2020/07/09 Python
实习销售业务员自我鉴定
2013/09/21 职场文书
对公司合理化的建议书
2014/03/12 职场文书
教师产假请假条范文
2014/04/10 职场文书
学校食堂食品安全责任书
2014/07/28 职场文书
2014旅游局党组书记党建工作汇报材料
2014/11/02 职场文书
客服专员岗位职责
2015/02/10 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
2015年度学校应急管理工作总结
2015/10/22 职场文书
MySQL删除和插入数据很慢的问题解决
2021/06/03 MySQL
JavaScript模拟实现网易云轮播效果
2022/04/04 Javascript