深入浅析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实现提取谷歌音乐搜索结果的方法
Jul 10 Python
Python编程实现的图片识别功能示例
Aug 03 Python
对Pandas MultiIndex(多重索引)详解
Nov 16 Python
Python中fnmatch模块的使用详情
Nov 30 Python
python基于itchat模块实现微信防撤回
Apr 29 Python
Python3.5迭代器与生成器用法实例分析
Apr 30 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
python使用tkinter库实现五子棋游戏
Jun 18 Python
python 有效的括号的实现代码示例
Nov 11 Python
python利用百度云接口实现车牌识别的示例
Feb 21 Python
Django后端分离 使用element-ui文件上传方式
Jul 12 Python
pytorch学习教程之自定义数据集
Nov 10 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
php循环语句 for()与foreach()用法区别介绍
2012/09/05 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
2013/10/25 PHP
php生成EAN_13标准条形码实例
2013/11/13 PHP
php的一个简单加密解密代码
2014/01/14 PHP
PHP屏蔽关键字实现方法
2016/11/17 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
JS实现时间格式化的方式汇总
2013/10/16 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
js如何打印object对象
2015/10/16 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
bootstrap快速制作后台界面
2016/12/05 Javascript
JavaScript实现垂直滚动条效果
2017/01/18 Javascript
Move.js入门
2017/02/08 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
基于vue实现移动端圆形旋钮插件效果
2018/11/28 Javascript
浅谈js中的bind
2019/03/18 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
[05:26]TI10典藏宝瓶套装外观展示
2020/07/03 DOTA
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
解决python 自动安装缺少模块的问题
2018/10/22 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
Python的log日志功能及设置方法
2019/07/11 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
2019/07/23 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
Python while true实现爬虫定时任务
2020/06/08 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
2020/10/15 Python
职业培训师职业生涯规划
2014/02/18 职场文书
总经理任命书范本
2014/06/05 职场文书
考试作弊检讨书怎么写?
2014/12/21 职场文书
2016年教师学习教师法心得体会
2016/01/20 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
MongoDB使用profile分析慢查询的步骤
2021/04/30 MongoDB