今天是学习python的第十四天,上次已经讲到了import了,现在咱们要学习下一个比较重要的板块了 类。咱们话不多说,直接上干货吧。
类
类就是面向对象的编程,你所编写的表示现实世界中的事物和情景的类,并由此来创建对象。根据类创建对象称为实列化。
创建和使用类
根据某个事物的特征分成某一类,后面具有这些特征的变量都会归为这一类。
创建dog类
class Dog:#这里定义了一个名为Dog的类。
"""一次模拟小狗的简单尝试"""
#第二行是文档字符串对类的功能进行了解释
def __init__(self,name,age):#类中的函数成为方法。前后两个下划线,避免Python默认方法与普通方法发生名称冲突。Python会自动运用该方法
"""初始化属性name和age"""
self.name = name
self.age = age
#该方法中,包括了self、name、age三个形参,其中self是必不可少的,且必须放在其它形参的前面,Python调用这个方法来创建dog实例的时候,将自动传入实参self,相当于方向标,使得相关变量自动传递到这里
#以self为前缀的变量可供类中的所有方法使用,这种也直接被称为属性了。
def sit(self):#这里不需要额外的信息只需要一个形参self
"""模拟小狗收到命令时蹲下。"""
print(f"{self.name} is now sitting")
def roll_over(self):
"""模拟小狗收到命令时打滚"""
print(f"{self.name} rolled over!")
根据类创建实例
class Dog:
"""一次模拟小狗的简单尝试"""
#第二行是文档字符串对类的功能进行了解释
def __init__(self,name,age):#类中的函数成为方法。前后两个下划线,避免Python默认方法与普通方法发生名称冲突。Python会自动运用该方法
"""初始化属性name和age"""
self.name = name
self.age =age
#该方法中,包括了self、name、age三个形参,其中self是必不可少的,且必须放在其它形参的前面,Python调用这个方法来创建dog实例的时候,将自动传入实参self,相当于方向标,使得相关变量自动传递到这里
#以self为前缀的变量可供类中的所有方法使用,这种也直接被称为属性了。
def sit(self):#这里不需要额外的信息只需要一个形参self
"""模拟小狗收到命令时蹲下。"""
print(f"{self.name} is now sitting")
def roll_over(self):
"""模拟小狗收到命令时打滚"""
print(f"{self.name} rolled over!")
my_dog = Dog('Willie',6)#创建特定小狗的实例,并使用提供的值来设置属性name和age,而将这个实例传递给my_dog。这里使用实参会直接调用方法--init--
print(f"My dog's name is {my_dog.name}")
print(f"My dog is {my_dog.age} years old.")
结果:
My dog’s name is Willie
My dog is 6 years old.
访问属性
获取小狗的名字使用
my_dog.name
句点表示法,Python获悉属性,让其找到实例my_dog,在Dog类中引用这个属性的时候,使用的是self.name,self处使用实例
调用方法(不是–init–)
my_dog.sit()
my_dog.roll_over()
结果:
Willie is now sitting
Willie rolled over!
要调用方法,可指定实例的名称(这里是my_dog)和要调用的方法 格式:实例的名称.调用方法
创建多个实例
创建多个实例等同于根据类创建一个新的实例
使用类和实例
首先创建一个类
class Car:
"""一次模拟汽车的简单尝试"""
def __init__(self,make,model,year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
def get_descriptive_name(self):
"""返回整洁的描述性信息"""
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
my_new_car = Car('audi','a4',2019)
my_new_car.get_descriptive_name()
print(my_new_car.get_descriptive_name())
结果:
2019 Audi A4
给属性指定默认值
创建实例时,有些属性无须通过形参来定义,可在方法__init__()来指定默认值
class Car:
"""一次模拟汽车的简单尝试"""
def __init__(self,make,model,year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0#给属性设置设置默认数值,在__init__方法中e,且定义默认属性时,不需要在括号中加入
def get_descriptive_name(self):
"""返回整洁的描述性信息"""
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
def read_odometer(self):
"""打印一条指出汽车里程的消息"""
print(f"This car has {self.odometer_reading} miles on it")
my_new_car = Car('audi','a4',2019)
my_new_car.get_descriptive_name()
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
结果:
2019 Audi A4
This car has 0 miles on it
修改属性的值
方法一:直接修改属性的值
最简单的方法就是通过实例来直接访问它。
my_new_car.odometer_reading = 23 # 直接通过实例访问里程的属性然后进行修改
my_new_car.read_odometer()
结果:
This car has 23 miles on it
方法二:通过方法修改属性值
实现内部的自我更新,无需直接访问属性来进行修改,只需要传递数值。新建了一个新方法,在该方法中设置了一个参数,将之前的属性 赋给该参数,再在最后调用一下该方法对其进行调用即可
def updata_odometer(self,mileage):
"""对里程表进行实时更新"""
self.odometer_reading = mileage
my_new_car.updata_odometer(23)
my_new_car.read_odometer()
结果:
This car has 23 miles on it
方法三:通过方法对属性的值进行递增
上述的两个方法都是直接转递全新的值,有时候我们需要在原有的基础上加上特定的值
def increase_odometer(self,miles):#在方法二的基础上新建了一个新的方法,来表示增量,并警告不能为赋值
"""增加新加的里程"""
if miles >= 0 :
self.odometer_reading += miles
else:
print("nmd hai xiang xiu gai cheng fu zhi")
my_new_car.updata_odometer(25)
my_new_car.read_odometer()
my_new_car.increase_odometer(25)
print(my_new_car.odometer_reading)
结果:
2019 Audi A4
This car has 25 miles on it
50
今天的学习就到这里了,类是一个很重要的板块所以真的需要我们好好学,加油