python从⼊门到实践第九章_《Python编程:从⼊门到实践》
python入门教程 下载(第九章)
第九章(类的学习)
《Python编程:从⼊门到实践》这⼀系列总结都是围绕python 3.X版本以上进⾏总结,不考虑2.7版本。
1.1基本概念
⾯向对象编程是最有效的软件编写⽅法之⼀。
⾯向对象编程:你编写表⽰现实世界中的事物和情景的类,并基于这些类来创建对象。编写类时,你定义⼀⼤类对象都有的通⽤⾏为。基于类创建对象时,每个对象都⾃动具备这种通⽤⾏为,然后可根据需要赋予每个对象独特的个性。
编程模式历程:⾯向过程编程-->⾯向函数编程-->⾯向对象编程
根据类来创建对象被称为实例化,这让你能够使⽤类的实例。
1.1.1类的作⽤
类的基本作⽤:你将指定可在实例中存储什么信息,定义可对这些实例执⾏哪些操作(类中定义公共,实例定义私有)
进阶使⽤(类的继承):编写⼀些类来扩展(继承既有类)既有类的功能,让相似的类能够⾼效地共享代码。
模块化:你将把⾃⼰编写的类存储在模块中,并在⾃⼰的程序⽂件中导⼊其他程序员编写的类。
1.2类的基本使⽤
使⽤类⼏乎可以模拟任何东西。注意:类表⽰的不是特定的事物,⽽是泛指这⼀事物。
⽐如狗就是⼀个类,⽽具体的狗:哈⼠奇,旺财...特指的就是对象,这些狗对象便是狗类实例出来的
⽽对于这些具体的狗,她们通常都有名字和年龄(属性),都会打滚和撒泼(⾏为),就将这些公共的封装到类中
根据Dog类创建的每个实例都将存储名字和年龄。我们赋予了每条⼩狗蹲下(sit())和打滚(roll_over())的能⼒
#Python 3中title()⽅法:返回"标题化"的字符串,就是说所有单词的⾸个字母转化为⼤写,其余字母均为⼩写
#请注意,⾮字母后的第⼀个字母将转换为⼤写字母
#基本语法:str.title()
#!/usr/bin/python3
str = "this is string example wow"
print (str.title())
txt = "hello b2b2b2 and 3g3g3g"
x = txt.title()
计算机编程语言哪个最难print(x)
#输出结果
#This Is String Example Wow
#Hello B2B2B2 And 3G3G3G
#Python3 istitle()⽅法:检测字符串中所有的单词拼写⾸字母是否为⼤写,且其他字母为⼩写。
#基本语法:str.istitle()
在类体或者函数体或者 .py ⽂档中,未赋给变量的第⼀个字符串通常是对类或函数或⽂档的整体⽂档功能的描述信息
class Dog():
#根据约定,在Python中,⾸字母⼤写的名称指的是类。这个类定义中的括号是空的,因为我们要从空⽩创建这个类。表⽰不继承既有类,
"""这是⼀次模拟⼩狗的简单使⽤"""
def __init__(self,name,age):
"""初始化⼩狗的属性名字和年龄"""
self.name = name
self.age = age
def sit(self):
"""模拟⼩狗被命令执⾏蹲下操作"""
print(self.name.title()+'is now sitting')
dog1 = Dog('哈⼠奇',5)
print(dog1)
dog1.sit()
1.2.1⽅法 __init__()
在类中定义的的函数我们称为⽅法;有关函数的⼀切都适⽤于⽅法,唯⼀重要的差别是调⽤⽅法的⽅式。⽽__init__()是⼀个特殊的⽅法,每当你根据Dog类创建新实例时,Python都会⾃动运⾏它(⽆需⼿动调⽤执⾏)(类似于JavaScript中class类的constructor构造函数)。
该⽅法最常见的⽤处:接受这些形参的值,并将它们存储在根据这个类创建的实例的属性中。
在这个⽅法的名称中,开头和末尾各有两个下划线,这是⼀种约定,旨在避免Python默认⽅法与普通⽅法发⽣名称冲突。所以我们⾃定义的标识符不推荐使⽤_作为开头,⽽是将其作为分隔符。
且 __init__()⽅法定义成了包含三个形参:self、name和age。只有self是固定的必须有的,还必须位于其他形参的前⾯,表⽰当前类的实例对象
创建Dog实例时,Python将调⽤Dog类的⽅法 __init__()。我们将通过实参向Dog()传递名字和年龄;self会⾃动传递,因此我们不需要传递它。每当我们根据Dog类创建实例时,都只需给最后两个形参(name和age)提供值。
钉钉是不是微服务架构
rf splitter为何必须在⽅法定义中包含形参self呢?
因为Python调⽤这个__init__()⽅法来创建Dog实例时,将⾃动传⼊实参self(和形参self进⾏区分)。每个与类相关联的⽅法调⽤都⾃动传递实参self,它是⼀个指向实例本⾝的引⽤,让实例能够访问类中的属性和⽅法(个⼈理解:感觉这句不太对,应该是在类中能够访问实例上定义的属性和⽅法)。
⽽在 __init__()函数体(⽅法)中:定义的两个变量都有前缀self。以self为前缀的变量都可供类中的所有⽅法使⽤(因为这相当于为self就是实例对象添加属性,⽽类其他函数都⾃动传self这个参数),我们还可以通过类的任何实例来访问这些变量。self.name = name获取存储在形参name中的值,并将其存储到变量name中,然后该变量被关联到当前创建的实例。
像这样可通过实例访问的变量称为属性。访问的变量称为⽅法
类中定义的其它函数(作为实例的⽅法)通常只有⼀个形参self,除⾮你需要在调⽤实例的⽅法时需要传递参数。⽽创建的实例能够访问这些⽅法,相当于是所有实例的公共⽅法,
1.2.2根据类创建实例
可将类视为有关如何创建实例的说明。Dog类是⼀系列说明,让Python知道如何创建表⽰特定⼩狗的实例。⽽这些实例都携带类中定义的公共属性和⽅法。
python中是不⽀持字符串和数字进⾏相加的,不会像JavaScript⼀样隐式将数字转换成字符串进⾏相加,你需要使⽤str()⽅法将数字转化成字符串才能与其他字符串进⾏相加。
类的实例化时,dog1 = Dog('willie',6),Python使⽤实参'willie'和6调⽤Dog类中的⽅法__init__()。⽅法__init__()创建⼀个表⽰特定⼩狗的⽰例,并使⽤我们提供的值来设置属性name和age。注意:__init__()并未显式地包含return语句,但Python⾃动返回⼀个表⽰这条⼩狗的实例。我们将这个实例存储在变量dog1中。
命名约定很有⽤:我们通常可以认为⾸字母⼤写的名称(如Dog)指的是类,⽽⼩写的名称(如my_dog)指的是根据类创建的实例。
要访问实例的属性,可使⽤句点表⽰法。这种语法演⽰了Python如何获悉属性的值。句号表⽰通过这个对象中寻某个属性或者⽅法
根据Dog类创建实例后,就可以使⽤句点表⽰法来调⽤Dog类中定义的任何⽅法。要调⽤⽅法,可指定实例的名称(这⾥是my_dog)和要调⽤的⽅法,并⽤句点分隔它们。遇到代码my_dog.sit()时,Python在类Dog中查⽅法sit()并运⾏其代码。注意:如果不加括号,表⽰对该⽅法的定义的引⽤
在Dog类中引⽤这个属性时,使⽤的是self.name。在外部获取实例的属性时,使⽤的是dog1.name。
我们给另⼀个实例指定同样的名字和年龄,Python依然会根据Dog类创建另⼀个实例。你可按需求根据⼀个类创建任意数量的实例,条件是将每个实例都存储在不同的变量中,或占⽤列表或字典的不同位置。
谨记:类名⾸字母要⼤写,实例对象要⼩写!
1.2.3修改通过类实例的对象
你的⼤部分时间都将花在根据类创建的实例上。你需要执⾏的⼀个重要任务是修改实例的属性。你可以直接修改实例的属性,也可以编写⽅法以特定的⽅式进⾏修改。
1.2.4给属性指定默认值和修改属性值
类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。在有些情况下,如设置默认值时,在⽅法__init__()内指定这种初始值是可⾏的;如果你对某个属性这样做了,就⽆需包含为它提供初始值的形参(这个形参就是可选的了)。
设置默认值的作⽤是,为后续操作修改属性值做准备!
#在__init__中指定属性值的默认值
class Dog():
def __init__(self,name,age):
self.odometer_reading = 0
修改属性值有三种⽅法
直接通过实例进⾏修改;
通过⽅法进⾏设置;
通过⽅法进⾏递增(增加特定的值)。
1. 直接修改属性的值(通过实例直接访问它并修改)
my_new_car.odometer_reading = 23
我们使⽤句点表⽰法来直接访问并设置汽车的属性odometer_reading。
这⾏代码让Python在实例my_new_car中到属性odometer_reading,并将该属性的值设置为23
2. 通过⽅法修改属性的值(⽆需直接访问属性,⽽可将值传递给⼀个⽅法,由它在内部进⾏更新。)
#注意,这个⽅法是定义在汽车类中的!!
def update_odometer(self, mileage):
"""将⾥程表读数设置为指定的值"""
self.odometer_reading = mileage
该⽅法接受⼀个参数(就是想要修改成什么值),在⽅法内部获取实例的属性进⾏修改
主要我们调⽤这个⽅法并传⼊值就能达到修改的⽬的。
拓展:禁⽌任何⼈将⾥程表读数往回调
def update_odometer(self, mileage):
"""
将⾥程表读数设置为指定的值
禁⽌将⾥程表读数往回调
"""
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("You can't roll back an odometer!")
上述代码就要求⾥程数只能增加,不能往回调减⼩。
手机软件制作魔幻特效
3. 通过⽅法对属性的值进⾏递增
有时候需要将属性值递增特定的量,⽽不是将其设置为全新的值。
#注意,这个⽅法是定义在汽车类中的!!
def increment_odometer(self, miles):
"""将⾥程表读数增加指定的量"""
self.odometer_reading += miles
扩展:以禁⽌增量为负值,从⽽防⽌有⼈利⽤它来回拨⾥程表。
注意!!你可以使⽤类似于上⾯的⽅法来控制⽤户修改属性值(如⾥程表读数)的⽅式,但能够访问程序的⼈都可以通过直接访问属性来将⾥程表修改为任何值。所以这还不能完全阻⽌⽤户回调数据。
1.3类中的继承(重中之重)
编写类时,并⾮总是要从空⽩开始。如果你要编写的类是另⼀个现成类的特殊版本,可使⽤继承。⼀个类继承另⼀个类时,它将⾃动获得另⼀个类的所有属性和⽅法;原有的类称为⽗类,⽽新类称为⼦
类。⼦类继承了其⽗类的所有属性和⽅法,同时还可以定义⾃⼰的属性和⽅法。(现在第三⽅模块⼤部分都采⽤了集成)(⼤部分框架都会给我们封装好⼀些类,我们在写类可以继承这些既有类!)
1.3.1⼦类的⽅法__init__()
创建⼦类的实例时,Python⾸先需要完成的任务是给⽗类的所有属性赋值。为此,⼦类的⽅
法__init__()需要⽗类施以援⼿.
class Car():
"""⼀次模拟汽车的简单尝试"""
def __init__(self, make, model, year):
self.make = make
self.odometer_reading = 0
def get_descriptive_name(self):stylesheet窗口名称
long_name = ar) + ' ' + self.make + ' ' + del
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!")
def increment_odometer(self, miles):
self.odometer_reading += miles
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self, make, model, year,size):
"""初始化⽗类的属性"""
super().__init__(make, model, year)
#定义⼦类特有属性
self.battery_size = size
#定义⼦类特有⽅法
def describe_battery(self):
"""打印⼀条描述电瓶容量的消息"""
print("This car has a " + str(self.battery_size) + "-kWh battery.")
my_tesla = ElectricCar('tesla', 'model s', 2016,70)
print(_descriptive_name())
很明显,⼦类ElectricCar已经完全⾃动继承了⽗类定义的⽅法(除了⽗类的__init__⽅法没有⾃动继承),
我们定义类的__init__⽅法通常适⽤于设置公共属性的(所有实例都⼜有该属性但值可以不⼀样,这取决于参数),如果想让⼦类的__init__也继承⽗类的__init__,这就需要在⼦类的__init__⽅法体中写super().__init__(make, model, year),表⽰调⽤⽗类的__init__⽅法,同时⽗类的__init__⽅法的slef形参指代的是⼦类实例对象,其他继承的⽗类的函数的self形参也指代的是⼦类实例对象
创建⼦类时,⽗类必须包含在当前⽂件中,且位于⼦类前⾯。
定义⼦类时,必须在括号内指定⽗类的名称。⽅法__init__接受创建ElectricCar实例所需的信息
super()是⼀个特殊函数,帮助Python将⽗类和⼦类关联起来。
⽽super().__init__(make, model, year)表⽰调⽤⽗类的__init__()⽅法并将实参传进去
让ElectricCar实例包含⽗类的所有属性。⽗类也称为超类(superclass),名称super因此⽽得名。
默认已经继承⽗类的所有的⽅法(后续⽗类会有专属静态⽅法),⽽⽗类属性继承需要在⼦类__init__调⽤super().__init__()⽅法

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。