深入浅析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实现指定字符串补全空格的方法
Apr 30 Python
python 垃圾收集机制的实例详解
Aug 20 Python
Python 实现一行输入多个值的方法
Apr 21 Python
Django使用Mysql数据库已经存在的数据表方法
May 27 Python
python pandas 如何替换某列的一个值
Jun 09 Python
Python类和对象的定义与实际应用案例分析
Dec 27 Python
在pytorch中查看可训练参数的例子
Aug 18 Python
Python 去除字符串中指定字符串
Mar 05 Python
python+opencv实现移动侦测(帧差法)
Mar 20 Python
在 Python 中使用 MQTT的方法
Aug 18 Python
python 爬取免费简历模板网站的示例
Sep 27 Python
python实现图片转字符画
Feb 19 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获取mysql数据库中的所有表名的代码
2011/04/23 PHP
php 类中的常量、静态属性、非静态属性的区别
2017/04/09 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
php转换上传word文件为PDF的方法【基于COM组件】
2019/06/10 PHP
一个用js实现的页内搜索代码
2007/05/23 Javascript
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
2010/08/27 Javascript
jquery 实现窗口的最大化不论什么情况
2013/09/03 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
JS获取网页属性包括宽、高等等
2014/04/03 Javascript
jquery操作HTML5 的data-*的用法实例分享
2014/08/17 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
2015/03/24 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
2016/01/04 Javascript
json实现添加、遍历与删除属性的方法
2016/06/17 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
2016/06/17 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
JS去除重复并统计数量的实现方法
2016/12/15 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
2017/02/16 Javascript
Bootstrap3多级下拉菜单
2017/02/24 Javascript
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
在Django的form中使用CSS进行设计的方法
2015/07/18 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
python中有关时间日期格式转换问题
2019/12/25 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
《蒙娜丽莎之约》教学反思
2014/02/27 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
大学开学典礼新闻稿
2015/07/17 职场文书
礼貌问候语大全
2015/11/10 职场文书
Python selenium的这三种等待方式一定要会!
2021/06/10 Python