将函数和数据封装起来,形成类,用类再来创建对象。比如我创建了小狗这一个类,然后创造了名为William,年龄6岁的小狗,这只狗就是对象。
一、创建和使用类
1、创建dog类
以下是Python的类代码的基本结构:
class ClassName:
# 一些类的属性和方法
def __init__(self, arg1, arg2, ...):
# 初始化方法
def method1(self, arg1, arg2, ...):
# 方法1
def method2(self, arg1, arg2, ...):
# 方法2
# 其他方法
其中:
class
关键字表示定义一个类。ClassName
是类的名称,按照惯例,类名称的首字母应该大写。- 类的属性和方法写在类的内部,使用缩进表示属于类的代码块。
__init__
方法是类的构造函数,用于初始化对象的属性。self
是表示对象本身的关键字,在方法中必须作为第一个参数。- 类的方法可以接受任意数量的参数,包括其他对象或基本数据类型。
- 在类中定义的属性和方法可以通过对象访问,也可以通过类访问。
class Dog:
#class就表示类,Dog首字母大写表示类
#一次模拟小狗的尝试
def __init__(self,name,age):
"""初始化属性name和age"""#“”“”“”这个注释还必须缩进4格子
self.name=name
self.age=age
def sit(self):
# """模拟小狗收到命令时做下"""
print(f"{self.name} is now sitting")
def roll_over(self):
"""模拟小狗收到命名时打滚"""
print(f"{self} rolled over")
__int__()有四个下划线。name和age为通过实例可以访问的变量称为属性。里面的函数称为方法。
2、根据类创建实例
class Dog:
#class就表示类,Dog首字母大写表示类
#一次模拟小狗的尝试
def __init__(self,name,age):
"""初始化属性name和age"""#“”“”“”这个注释还必须缩进4格子
self.name=name
self.age=age
def sit(self):
# """模拟小狗收到命令时做下"""
print(f"{self.name} is now sitting")
def roll_over(self):
"""模拟小狗收到命名时打滚"""
print(f"{self.name} rolled over")
my_dog=Dog("willie",6)#类创建的实例
print(f"my dog is called {my_dog.name}")#要访问属性,用点号
print(f"my dog is {my_dog.age} ")
小写字母表示类创建的实例
- 访问属性
要访问属性(类中第一个函数里的形参,除了self),用点号
my_dog.name
- 调用方法
class Dog:
#class就表示类,Dog首字母大写表示类
#一次模拟小狗的尝试
def __init__(self,name,age):
"""初始化属性name和age"""#“”“”“”这个注释还必须缩进4格子
self.name=name
self.age=age
def sit(self):
# """模拟小狗收到命令时做下"""
print(f"{self.name} is now sitting")
def roll_over(self):
"""模拟小狗收到命名时打滚"""
print(f"{self.name} rolled over")
my_dog=Dog('willie',6)
my_dog.sit()
my_dog.roll_over()
- 创建多个实例
my_dog=Dog('willie',6)
your_dog=Dog('cue',16)
二、使用类和实例
1、car类
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',25)
print(my_new_car.get_descriptive_name())
2、给属性指定默认值
给里程这个默认值,不用放在形参里面
class Car:
"""一次模拟汽车的简单尝试"""
def __init__(self,make,model,year):
"""初始化描述汽车的属性"""
self.make=make
self.model=model
self.year=year
self.odometer_reading=110#给里程这个默认值,不用放在形参里面
def read_odometer_reading(self):
"""返回格式化描述的信息"""
print(f"{self.make} {self.model} has {self.odometer_reading} on it")
my_new_car=Car('audi','a4',25)
my_new_car.read_odometer_reading()
3、修改属性的值
三种方法分别为:直接修改属性的值、通过方法设置、通过方法传递值(增加特定的值)
class Car:
"""一次模拟汽车的简单尝试"""
def __init__(self,make,model,year):
"""初始化描述汽车的属性"""
self.make=make
self.model=model
self.year=year
self.odometer_reading=110#给里程这个默认值,不用放在形参里面
def read_odometer_reading(self):
"""返回格式化描述的信息"""
print(f"{self.make} {self.model} has {self.odometer_reading} on it")
def update_odometer_reading(self,mileage):
"""返回格式化描述的信息"""
self.odometer_reading=mileage#通过方法设置
def increment_odometer(self,miles):
"""让里程表的读数增加特定的增量"""
self.odometer_reading+=miles
my_new_car=Car('audi','a4',25)
my_new_car.odometer_reading=90#直接修改
my_new_car.update_odometer_reading(99)#通过方法设置
my_new_car.increment_odometer(100)#通过方法让属性的值递增
三、继承
子类继承父类的所有属性和方法
1、子类的__init__()方法
class Car:
"""一次模拟汽车的简单尝试"""
def __init__(self,make,model,year):
"""初始化描述汽车的属性"""
self.make=make
self.model=model
self.year=year
self.odometer_reading=110#给里程这个默认值,不用放在形参里面
def read_odometer_reading(self):
"""返回格式化描述的信息"""
print(f"{self.make} {self.model} has {self.odometer_reading} on it")
def get_descriptive_name(self):
"""返回格式化描述的信息"""
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
def update_odometer_reading(self,mileage):
"""返回格式化描述的信息"""
self.odometer_reading=mileage#通过方法设置
def increment_odometer(self,miles):
"""让里程表的读数增加特定的增量"""
self.odometer_reading+=miles
class ElectricCar(Car):#继承父类就加入父类的名
"""电动汽车的独特之处"""
def __init__(self,make,model,year):
"""初始化父类的属性"""
super().__init__(make,model,year)#super()是一个特殊的函数,
#让你可以调用父类的方法
my_car=ElectricCar('benchi','baoma','x90')
print(my_car.get_descriptive_name())
2、给子类定义属性和方法
class Car:
"""一次模拟汽车的简单尝试"""
def __init__(self,make,model,year):
"""初始化描述汽车的属性"""
self.make=make
self.model=model
self.year=year
self.odometer_reading=110#给里程这个默认值,不用放在形参里面
def read_odometer_reading(self):
"""返回格式化描述的信息"""
print(f"{self.make} {self.model} has {self.odometer_reading} on it")
def get_descriptive_name(self):
"""返回格式化描述的信息"""
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
def update_odometer_reading(self,mileage):
"""返回格式化描述的信息"""
self.odometer_reading=mileage#通过方法设置
def increment_odometer(self,miles):
"""让里程表的读数增加特定的增量"""
self.odometer_reading+=miles
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self,make,model,year):
"""初始化父类的属性"""
super().__init__(make,model,year)
self.battey_size=40#给子类定义属性和方法
def describe_battery(self):#给子类定义属性和方法
"""打印一条描述电池容量的消息"""
print(self.battey_size)
my_car=ElectricCar('benchi','baoma','x90')
print(my_car.get_descriptive_name())
my_car.describe_battery()#给子类定义属性和方法
3、重写父类中的方法
子类中与父类同名的方法,python就会忽略父类中的方法 只关注你在子类中定义的方法
class Car:
"""一次模拟汽车的简单尝试"""
def __init__(self,make,model,year):
"""初始化描述汽车的属性"""
self.make=make
self.model=model
self.year=year
self.odometer_reading=110#给里程这个默认值,不用放在形参里面
def read_odometer_reading(self):
"""返回格式化描述的信息"""
print(f"{self.make} {self.model} has {self.odometer_reading} on it")
def get_descriptive_name(self):
"""返回格式化描述的信息"""
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
def update_odometer_reading(self,mileage):
"""返回格式化描述的信息"""
self.odometer_reading=mileage#通过方法设置
def increment_odometer(self,miles):
"""让里程表的读数增加特定的增量"""
self.odometer_reading+=miles
def fill_gas_tank(self):#这是与子类同名的方法,python就会忽略父类中的方法
#只关注你在子类中定义的方法
"""电动车有汽油"""
print("the car has a gas tank")
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self,make,model,year):
"""初始化父类的属性"""
super().__init__(make,model,year)
self.battey_size=40
def describe_battery(self):
"""打印一条描述电池容量的消息"""
print(self.battey_size)
def fill_gas_tank(self):#这是与父类同名的方法,python就会忽略父类中的方法
#只关注你在子类中定义的方法
"""电动车没有汽油"""
print("the car has not a gas tank")
my_car=ElectricCar('benchi','baoma','x90')
my_car.fill_gas_tank()#只会显示子类的方法,舍弃父类同名的方法
4、将实例用作属性
将大型类拆分成多个协同工作的小类,这种方法称为组合。
比如电动车中有和很多包含电池的属性和方法,就单独提取出来,作为一个类
class Car:
"""一次模拟汽车的简单尝试"""
def __init__(self,make,model,year):
"""初始化描述汽车的属性"""
self.make=make
self.model=model
self.year=year
self.odometer_reading=110#给里程这个默认值,不用放在形参里面
def read_odometer_reading(self):
"""返回格式化描述的信息"""
print(f"{self.make} {self.model} has {self.odometer_reading} on it")
def get_descriptive_name(self):
"""返回格式化描述的信息"""
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
def update_odometer_reading(self,mileage):
"""返回格式化描述的信息"""
self.odometer_reading=mileage#通过方法设置
def increment_odometer(self,miles):
"""让里程表的读数增加特定的增量"""
self.odometer_reading+=miles
def fill_gas_tank(self):#这是与子类同名的方法,python就会忽略父类中的方法
#只关注你在子类中定义的方法
"""电动车有汽油"""
print("the car has a gas tank")
class Battery:#单独提出来
"""一次模拟电动车的简单尝试"""
def __init__(self,battery_size=40):
"""初始化电池的属性"""
self.battery_size=battery_size
def describe_battery(self):
"""打印一条描述电池容量的信息"""
print(f"{self.battery_size}_kwh")
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self,make,model,year):
"""初始化父类的属性"""
super().__init__(make,model,year)
self.battery=Battery()#单独提出的赋值给电动车
def fill_gas_tank(self):#这是与父类同名的方法,python就会忽略父类中的方法
#只关注你在子类中定义的方法
"""电动车没有汽油"""
print("the car has not a gas tank")
my_car=ElectricCar('benchi','baoma','x90')
my_car.battery.describe_battery()#电动车类和电池类就在一起了
5、模拟实物
属性、方法、类、父类、子类、单独类之间的相互关系的运用,就可以用代码来描述实际事物