Python类与实例的使用详解

目录
  • 视频
  • 使用类和实例
  • 修改属性值

视频

本课程的视频

使用类和实例

你可以使用类来模拟现实世界中的很多情景。类编写好后,你的大部分时间都将花在使用根据类创建的实例上。你需要执行的一个重要任务是修改实例的属性。

Car类

下面来编写一个表示汽车的类,它存储了有关汽车的信息,还有一个汇总这些信息的方法:

car.py

class Car():
	"""一次模拟汽车的简单尝试"""
	def __init__(self, make, model, year):
		"""初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
    def get_descriptive_name(self):
    	"""返回整洁的描述性信息"""
    	long_name = str(self.year) + ' ' + self.make + ' ' + self.model
    	return long_name.title()
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name()) 

第3行:定义了方法__init__()。第一个形参为self;方法中包含了另外三个形参:make、model和year。方法__init__()接受这些形参的值,并将它们存储在根据这个类创建的实例的属性中。创建新的Car实例时,需要指定其制造商、型号和生产年份。

第8行:定义了名为get_descriptive_name()的方法,它使用属性year、make和model创建一个对汽车进行描述的字符串。为了访问属性的值,使用了self.makeself.modelself.year

第12行,根据Car类创建了一个实例,并将其存储到变量my_new_car中。接下来,调用方法get_descriptive_name(),指出是一辆什么样的汽车:

2016 Audi A4

为让这个类更有趣,下面给它添加一个随时间变化的属性,它存储汽车的总里程。

类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。在有些情况下,如设置默认值时,需要在方法__init__()内指定初始值;这样就无需包含为它提供初始值的形参。

下面来添加一个名为odometer_reading属性,其初始值总是为0。还添加了一个名为read_odometer()的方法,用于读取汽车的里程表:

class Car():
	"""一次模拟汽车的简单尝试"""
	def __init__(self, make, model, year):
		"""初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
    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() 

现在,当创建新实例时,将像前一个示例一样以属性的方式存储制造商、型号和生产年份。接下来,Python将创建一个名为odometer_reading的属性,并将其初始值设置为0。

第13行:还定义了一个名为read_odometer()的方法,用它能够轻松地获悉汽车的里程。

一开始汽车的里程为0:

2016 Audi A4

This car has 0 miles on it.

修改属性值

出售时里程表读数为0的汽车并不多,因此需要一个修改该属性的值的途径。

可以以三种不同的方式修改属性的值:直接通过实例进行修改;通过方法进行设置;通过方法进行递增(增加特定的值)。下面依次介绍这些方法。

直接修改属性的值

要修改属性的值,最简单的方式是通过实例直接访问它。下面的代码直接将里程表读数设置为23:

my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()

第4行,使用句点表示法来直接访问并设置汽车的属性odometer_reading。这行代码让Python在实例my_new_car中找到属性odometer_reading,并将该属性的值设置为23:

2016 Audi A4

This car has 23 miles on it.

有时候需要像这样直接访问属性,但其他时候需要编写对属性进行更新的方法。

通过方法修改属性的值

如果有替你更新属性的方法,将很方便。这样,你就无需直接访问属性,而可将值传递给一个方法,由它在内部进行更新。

下面的示例演示了一个名为update_odometer()的方法:

class Car():
	"""一次模拟汽车的简单尝试"""
	def __init__(self, make, model, year):
		"""初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
    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
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(23)
my_new_car.read_odometer()

对Car类所做的唯一修改是在第16行添加了方法update_odometer()。这个方法接受一个里程值,

并将其存储到self.odometer_reading中。第23行,调用了update_odometer(),并向它提供了 实参23。它将里程表读数设置为23;而方法read_odometer()打印该读数:

2016 Audi A4

This car has 23 miles on it.

可对方法update_odometer()进行扩展,使其在修改里程表读数时做些额外的工作。下面来添加一些逻辑,禁止任何人将里程表读数往回调:

class Car():
	"""一次模拟汽车的简单尝试"""
	def __init__(self, make, model, year):
		"""初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
    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):
        """
        将里程表读数设置为指定的值
        禁止将里程表读数往回调
        """
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!") 

现在,update_odometer()在修改属性前检查指定的读数是否合理。如果新指定的里程(mileage)大于或等于原来的里程(self.odometer_reading),就将里程表读数改为新指定的里程;否则就发出警告,指出不能将里程表往回拨。

通过方法对属性的值进行递增

有时候需要将属性值递增特定的量,而不是将其设置为全新的值。假设购买了一辆二手车,且从购买到登记期间增加了100英里的里程,下面的方法让能够传递这个增量,并相应地增加里程表读数:

class Car():
	--snip--
    def increment_odometer(self, miles):
        """将里程表读数增加指定的量"""
        self.odometer_reading += miles
my_used_car = Car('subaru', 'outback', 2013)
print(my_used_car.get_descriptive_name())
my_used_car.update_odometer(23500)
my_used_car.read_odometer()
my_used_car.increment_odometer(100)
my_used_car.read_odometer() 

第3行:新增的方法increment_odometer()接受一个单位为英里的数字,并将其加入到self.odometer_reading中。第8行,创建了一辆二手车——my_used_car。第10行,调用

方法update_odometer()并传入23500,将这辆二手车的里程表读数设置为23500。第12行,调

increment_odometer()并传入100,以增加从购买到登记期间行驶的100英里:

2013 Subaru Outback

This car has 23500 miles on it.

This car has 23600 miles on it.

你可以轻松地修改这个方法,以禁止增量为负值,从而防止有人利用它来回拨里程表。

注意: 你可以使用类似于上面的方法来控制用户修改属性值(如里程表读数)的方式,但能够访问程序的人都可以通过直接访问属性来将里程表修改为任何值。要确保安全,除了进行类似于前面的基本检查外,还需特别注意细节。

到此这篇关于Python类与实例的使用详解的文章就介绍到这了,更多相关Python类与实例内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python 变量类型实例详解

    目录 1.变量赋值 2.多个变量赋值 3.标准数据类型 4.Python 数字 5.Python字符串 6.Python列表 7.ython 元组 8..Python 字典 9.Python数据类型转换 前言: 变量存储在内存中的值,这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符. 1.变量赋值 Python 中的变量赋值不需要类型声明. 每个变量在内

  • python聚类算法选择方法实例

    说明 1.如果数据集是高维度的,选择谱聚类是子空间的一种. 2.如果数据量是中小型的,比如在100W条以内,K均值会是更好的选择:如果数据量超过100W条,可以考虑使用MiniBatchKMeans. 3.如果数据集中有噪声(离群点),使用基于密度的DBSCAN可以有效解决这个问题. 4.若追求更高的分类准确性,则选择谱聚类比K均值准确性更好. 实例 import numpy as np import matplotlib.pyplot as plt # 数据准备 raw_data = np.l

  • python基础之类属性和实例属性

    属性:类属性和实例属性 类属性:就是类对象所有的属性 小结 '类属性 是可以 被 类对象和实例对象共同访问的 实例属性只能由实例对象访问 class Student: name='黎明' #属于类属性 就是Student类对象所拥有的 def __init__(self,age): self.age=age #实例属性 pass pass lm=Student(17) print(lm.name) #通过实例对象去访问类属性 print(lm.age) class Student: name='

  • Python自定义元类的实例讲解

    1.说明 一个类没有声明自己的元类,默认他的元类就是type,除了使用元类type,用户也可以通过继承type来自定义元类. 2.实例 我们可以使用类属性 __metaclass__ 把一个类的创建过程,转交给其它地方. class A(object): __metaclass__ = ... # 这个类的创建转交给其他地方 pass 先定义了类 A,然后定义了一个类属性 __metaclass__,这个属性表示创建类 A 的过程,转交给其它地方处理. 类属性 __metaclass__ 可以是

  • Python中类变量和实例变量的区别

    目录 一.前言 二.解决过程 三.总结 一.前言 有人提问了一个关于Python类变量和实例变量的问题,这里拿出来给大家分享下,一起学习. 是用英文提问的,当然了英文看上去也不难,有点二级英文基础,也看得懂,实在不行,在线翻译一下也问题不大了. 二.解决过程 这里主要涉及到三个部分,类属性,实例属性,及实例属性的引用对象指向性问题.在该例中counter为类属性,__first为实例属性,print函数中的counter为实例属性的引用对象指向性问题.当ExampleClass类实例化时,__i

  • Python类与实例的使用详解

    目录 视频 使用类和实例 修改属性值 视频 本课程的视频 使用类和实例 你可以使用类来模拟现实世界中的很多情景.类编写好后,你的大部分时间都将花在使用根据类创建的实例上.你需要执行的一个重要任务是修改实例的属性. Car类 下面来编写一个表示汽车的类,它存储了有关汽车的信息,还有一个汇总这些信息的方法: car.py class Car(): """一次模拟汽车的简单尝试""" def __init__(self, make, model, ye

  • Python类装饰器实现方法详解

    本文实例讲述了Python类装饰器.分享给大家供大家参考,具体如下: 编写类装饰器 类装饰器类似于函数装饰器的概念,但它应用于类,它们可以用于管理类自身,或者用来拦截实例创建调用以管理实例. 单体类 由于类装饰器可以拦截实例创建调用,所以它们可以用来管理一个类的所有实例,或者扩展这些实例的接口. 下面的类装饰器实现了传统的单体编码模式,即最多只有一个类的一个实例存在. instances = {} # 全局变量,管理实例 def getInstance(aClass, *args): if aC

  • Python类中self参数用法详解

    Python编写类的时候,每个函数参数第一个参数都是self,一开始我不管它到底是干嘛的,只知道必须要写上.后来对Python渐渐熟悉了一点,再回头看self的概念,似乎有点弄明白了. 首先明确的是self只有在类的方法中才会有,独立的函数或方法是不必带有self的.self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数. self名称不是必须的,在python中self不是关键词,你可以定义成a或b或其它名字都可以,但是约定成俗(为了和其他编程语言统一,减少理解难度),不要搞另类,

  • Python 类,对象,数据分类,函数参数传递详解

    目录 1.基本概念 1.1 类与对象的关系 1.3 对象的创建与引用 2.数据的分类 2.1 不可变类型 2.2 可变类型 3.函数传递参数的方式 3.1 值传递 3.2 引用传递 总结 最近在基于python写的接口自动化脚本,从Excel表中读取所有数据,每一行数据保存为字典,再将很多行的字典数据保存到一个列表里,运行时发现,列表中的字典均相同,且一直是excel最后一行的数据,情况类比如下: dd = {"a":1,"b":10} i = 2 list1 =

  • Python元类与迭代器生成器案例详解

    1.__getattr__和__getattribute__魔法函数 __getattr__是当类调用一个不存在的属性时才会调用getattr魔法函数,他传入的值item就是你这个调用的不存在的值. __getattribute__则是无条件的优先执行,所以如果不是特殊情况最好不要用__getattribute__. class User(object): def __init__(self, name, info): self.name = name self.info = info def

  • python之class类和方法的用法详解

    目录 类和方法的概念和实例 1.python类:class 2.类的构造方法__init__() 3.类中方法的参数self 4.继承 5.方法重写 类的特殊属性与方法 类的私有属性 类的私有方法 类和方法的概念和实例 类(Class):用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 方法:类中定义的函数. 类的构造方法__init__():类有一个名为 init() 的特殊方法(构造方法),该方法在类实例化时会自动调用. 实例变量:在类的

  • 对python中不同模块(函数、类、变量)的调用详解

    首先,先介绍两种引入模块的方法. 法一:将整个文件引入 import 文件名 文件名.函数名( ) / 文件名.类名 通过这个方法可以运行另外一个文件里的函数 法二:只引入某个文件中一个类/函数/变量 需要从某个文件中引入多个函数或变量时,用逗号隔开即可 from 文件名 import 函数名,类名,变量名 接下来,通过一个具体的例子说明引入 模块的具体方法: 假设新建一个python包test2,里边有一个名为run.py的python文件,run.py文件里有一个名为running()的函数

  • python 中不同包 类 方法 之间的调用详解

    目录结构如下: 在hello.py中导入ORM.py这个文件的时候,采用 import ORMPackage.ORM 或者 import ORM u = User(id = 123, name='codiy', email='codiy_huang@163.com', password='123456') 两种方式均报错 错误提示: name '***' is not defined 或者 No module named ORM 解决办法: 方法一 将包所在的目录添加到sys.path路径 im

  • Python中np.random.randint()参数详解及用法实例

    目录 可实现功能: np.random.randint() 根据参数中所指定的范围生成随机 整数. 参数 一.基础用法 二.高级用法 总结 可实现功能: 1.随机生成一个整数. 2.随机生成任意范围内的一个整数. 3.随机生成指定长度的整数组 4.随机生成指定长度的任意范围的整数组 5.随机生成指定长度的多维整数组 6.随机生成指定长度的任意范围的多维整数组 np.random.randint() 根据参数中所指定的范围生成随机 整数. numpy.random.randint(low, hig

  • Bottle框架中的装饰器类和描述符应用详解

    最近在阅读Python微型Web框架Bottle的源码,发现了Bottle中有一个既是装饰器类又是描述符的有趣实现.刚好这两个点是Python比较的难理解,又混合在一起,让代码有些晦涩难懂.但理解代码之后不由得为Python语言的简洁优美赞叹.所以把相关知识和想法稍微整理,以供分享. 正文 Bottle是Python的一个微型Web框架,所有代码都在一个bottle.py文件中,只依赖标准库实现,兼容Python 2和Python 3,而且最新的稳定版0.12代码也只有3700行左右.虽然小,但

随机推荐