1.13.1 :创建和使用类
1)创建Dog类
根据Dog类创建的每个实力都将存储名字和年龄。我们赋予每条小狗蹲下sit()和打滚roll_over()的能力
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's name is "+str(my_dog.age)+" years old.")
编译通过,但是目前为止任不知道这个类能不能调用和使用。
方法 init()
init是一个特殊的方法,每当你根据Dog类创建新实例时,Python都会自动运行它
双下斜杆这是一种约定,为了避免Python默认方法与普通方法发生名称的冲突:
我在写上面的程序的时候编译一直没通过,想了很久,报错是这样的
**Traceback (most recent call last):
File “E:/Python_Study/python_charm/pycharm_study.py”, line 702, in
my_dog = Dog(‘willie’, 6)
TypeError: object() takes no parameters
最后发现我把 def init(self,name,age): 一直 写成 def int(self,name,age):,使用pycharm调用的第一个 结果一直报错,自己粗心也一直没看出问题,最后看了度娘让我研究 init有没有写错才发现,希望大家不要跟我一样踩坑,不过踩了坑的好处在于我以后肯定不会在这里再跳坑了。
1.13.2 :调用方法
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)
my_dog.sit()
my_dog.roll_over()
Willieis now sitting.
Willierolled over!.
Process finished with exit code 0
遇到代码my_dog.sit()时候 ,Python在类Dog中查找方法sit()并运行其代码,Python以同样的方法解读代码my_dog.roll.over()
1.13.3:创建多个实例
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)
your_dog= Dog("Lucky",4)
# my_dog.sit()
# my_dog.roll_over()
print("My dog's name is "+my_dog.name.title()+".")
print("My dog's name is "+str(my_dog.age)+" years old.")
my_dog.sit()
my_dog.roll_over()
print("\nYour dog's name is " + your_dog.name.title() + ".")
print("Your dog is " + str(your_dog.age) + " years old.")
your_dog.sit()
动手练一练
9-1 餐馆 :创建一个名为Restaurant 的类,其方法init() 设置两个属性:restaurant_name 和cuisine_type 。创建一个名 为describe_restaurant() 的方法和一个名为open_restaurant() 的方法,其中前者打印前述两项信息,而后者打印一条消息,指出餐馆正在营业。
class Restaurant():
def __init__(self,restaurant_name,cuisine_type):
self.restaurant_name=restaurant_name
self.cuisine_type=cuisine_type
def describe_restaurant(self):
print(self.restaurant_name.title()+" restaurant is a good place")
print("The restaurant cuisine_type is "+self.cuisine_type.title())
def open_restaurant(self):
print("The restaurant is opened")
restaurant=Restaurant("Guangzhou Jiujia",'Yue Cai')
restaurant.describe_restaurant()
restaurant.open_restaurant()
9-2 三家餐馆 :根据你为完成练习9-1而编写的类创建三个实例,并对每个实例调用方法describe_restaurant() 。
class Restaurant():
def __init__(self,restaurant_name,cuisine_type):
self.restaurant_name=restaurant_name
self.cuisine_type=cuisine_type
def describe_restaurant(self):
print(self.restaurant_name.title()+" restaurant is a good place")
print("The restaurant cuisine_type is "+self.cuisine_type.title())
def open_restaurant(self):
print("The restaurant is opened")
restaurant1=Restaurant("Guangzhou Jiujia",'Yue Cai')
restaurant1.describe_restaurant()
restaurant1.open_restaurant()
restaurant2=Restaurant("A",'B')
restaurant2.describe_restaurant()
restaurant3=Restaurant("A1",'B1')
restaurant3.describe_restaurant()
9-3 用户 :创建一个名为User 的类,其中包含属性first_name 和last_name ,还有用户简介通常会存储的其他几个属性。在类User 中定义一个名 为describe_user() 的方法,它打印用户信息摘要;再定义一个名为greet_user() 的方法,它向用户发出个性化的问候。
创建多个表示不同用户的实例,并对每个实例都调用上述两个方法。
class User():
def __init__(self,first_name,last_name):
self.first_name=first_name
self.last_name=last_name
def describe_user(self):
print("fitst_name :", self.first_name, " last_name: ", self.last_name)
def greet_user(self):
print("Hello,"+self.first_name+" "+self.last_name+"!")
user=User("Gonathan","Guo")
user.describe_user()
user.greet_user()
user=User("Jack","Ma")
user.describe_user()
user.greet_user()
user=User("Tencent","Ma")
user.describe_user()
user.greet_user()
fitst_name : Gonathan last_name: Guo
Hello,Gonathan Guo!
fitst_name : Jack last_name: Ma
Hello,Jack Ma!
fitst_name : Tencent last_name: Ma
Hello,Tencent Ma!
1.13.4:修改类属性的值、
class Car():
def __init__(self,make,model,year):
"初始化描述汽车属性"
self.make=make
self.model=model
self.year=year
self.odometer_reading=0 #注意在类中直接添加一个形参,默认为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.odometer_reading=23 #直接访问属性,进行修改
my_new_car.read_odometer()
使用句点表示法直接访问并设置汽车的属性odometer_reading.直接在my_new_car找到属性odometer_reading并将该属性的值设置为23.
1.13.5:通过方法修改属性的值
class Car():
def __init__(self,make,model,year):
"初始化描述汽车属性"
self.make=make
self.model=model
self.year=year
self.odometer_reading=0 #注意在类中直接添加一个形参,默认为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.odometer_reading=23 #直接访问属性,进行修改
my_new_car.update_odometer(110) #通过直接调用函数的方法修改相应的值
my_new_car.read_odometer()
可对方法update_odometer()进行扩展,使其在修改里程数表读数的时候做些额外的工作,下面添加一些逻辑,禁止任何人将里面的里程表读数往回调:
同时增加一行对属性的值进行递增
class Car():
def __init__(self,make,model,year):
"初始化描述汽车属性"
self.make=make
self.model=model
self.year=year
self.odometer_reading=0 #注意在类中直接添加一个形参,默认为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")
def increment_odometer(self,miles):
self.odometer_reading+=miles
my_new_car=Car('audi','a4','2016')
print(my_new_car.get_descriptive_name())
# my_new_car.odometer_reading=23 #直接访问属性,进行修改
my_new_car.update_odometer(23000) #通过直接调用函数的方法修改相应的值
my_new_car.read_odometer()
my_new_car.increment_odometer(1000)
my_new_car.read_odometer()
2016 Audi A4
This car has 23000 miles on it.
You can’t roll back an odometer
This car has 24000 miles on it.
动手练一练
9-4
class Restaurant():
def __init__(self,restaurant_name,cuisine_type):
self.restaurant_name=restaurant_name
self.cuisine_type=cuisine_type
self.number_served=0
def describe_restaurant(self):
print(self.restaurant_name.title()+" restaurant is a good place")
print("The restaurant cuisine_type is "+self.cuisine_type.title())
def open_restaurant(self):
print("The restaurant is opened")
def restaurant(self,number):
self.number_served=number
def restaurant_incrase(self,numberadd):
self.number_served+=numberadd
def read_number_served(self): #增加一条读里程数的函数
print("There hve " + str(self.number_served) + " people severed in it")
restaurant1=Restaurant("Guangzhou Jiujia",'Yue Cai')
restaurant1.describe_restaurant()
restaurant1.open_restaurant()
restaurant1.restaurant(23)
restaurant1.read_number_served()
restaurant1.restaurant_incrase(15)
restaurant1.read_number_served()
Guangzhou Jiujia restaurant is a good place
The restaurant cuisine_type is Yue Cai
The restaurant is opened
There hve 23 people severed in it
There hve 38 people severed in it
9-5
class User():
def __init__(self,first_name,last_name):
self.first_name=first_name
self.last_name=last_name
self.login_attempts=1
def describe_user(self):
print("fitst_name :", self.first_name, " last_name: ", self.last_name)
def greet_user(self):
print("Hello,"+self.first_name+" "+self.last_name+"!")
def increment_login_attempts(self):
self.login_attempts +=1
def reset_login_attempts(self):
self.login_attempts=0
def read_login_attempts(self):
print(self.first_name+" "+self.last_name+","+"you have been login "+str(self.login_attempts)+" times.")
Gonathan Guo,you have been login 1 times.
Gonathan Guo,you have been login 2 times.
Gonathan Guo,you have been login 6 times.
Gonathan Guo,you have been login 0 times.
1.13.6:继承父类得值
注意点:创建子类时,父类必须包含在当前文件中,且位于子类前面,在2处,我们定义了子类ElectricCar。定义子类时,必须在括号内指定父类得名称,方法 init()接受创建Car实例所需得信息。
super()用于将父类跟子类相关联起来。
lass Car():
def __init__(self,make,model,year):
"初始化描述汽车属性"
self.make=make
self.model=model
self.year=year
self.odometer_reading=0 #注意在类中直接添加一个形参,默认为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")
def increment_odometer(self,miles):
self.odometer_reading+=miles
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())
1.13.7:将实例用作属性
将一个Battery 实例作为ElectricCar类一个属性
class Car():
def __init__(self,make,model,year):
"初始化描述汽车属性"
self.make=make
self.model=model
self.year=year
self.odometer_reading=0 #注意在类中直接添加一个形参,默认为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")
def increment_odometer(self,miles):
self.odometer_reading+=miles
class Battery():
def __init__(self,battery_size=70):
self.battery_size=battery_size
def describe_battery(self):
""""打印一条描述电瓶容量得信息"""
print("This car has a " + str(self.battery_size) + " -kwh battery.")
class ElectricCar(Car):
""""电动汽车得独特之处"""
"""初始化父类得属性 再初始化电动汽车特有得属性"""
def __init__(self,make,model,year):
""""初始化父类得属性"""
super().__init__(make,model,year)
self.battery=Battery()
def fill_gas_tank(self):
print("This car doesn't need a gas tank!")
my_tesla=ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
Python从入门到实践 9-9电瓶容量升级
class Car():
def __init__(self,make,model,year):
"初始化描述汽车属性"
self.make=make
self.model=model
self.year=year
self.odometer_reading=0 #注意在类中直接添加一个形参,默认为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")
def increment_odometer(self,miles):
self.odometer_reading+=miles
class Battery():
def __init__(self,battery_size=70):
self.battery_size=battery_size
def describe_battery(self):
""""打印一条描述电瓶容量得信息"""
print("This car has a " + str(self.battery_size) + " -kwh battery.")
def fill_gas_tank(self):
print("This car doesn't need a gas tank!")
def get_range(self):
if self.battery_size == 70:
range = 240
elif self.battery_size == 85:
range = 270
message = "This car can go approximately " + str(range)
message += " miles on a full charge."
print(message)
def upgtade_battery(self):
if self.battery_size !=85:
self.battery_size=85
class ElectricCar(Car):
""""电动汽车得独特之处"""
"""初始化父类得属性 再初始化电动汽车特有得属性"""
def __init__(self,make,model,year):
""""初始化父类得属性"""
super().__init__(make,model,year)
self.battery=Battery()
my_tesla=ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
my_tesla.battery.upgtade_battery()
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
2016 Tesla Model S
This car has a 70 -kwh battery.
This car can go approximately 240 miles on a full charge.
This car has a 85 -kwh battery.
This car can go approximately 270 miles on a full charge.
1.13.8:导入类
car.py
class Car():
def __init__(self,make,model,year):
"初始化描述汽车属性"
self.make=make
self.model=model
self.year=year
self.odometer_reading=0 #注意在类中直接添加一个形参,默认为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")
def increment_odometer(self,miles):
self.odometer_reading+=miles
m_car.py
from car import Car
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()
2016 Audi A4
This car has 23 miles on it.
1.13.8:导入整个模块
import car
# from car import ElectricCar,Car
my_beetle= car.Car('Volkswagen','beetle',2016)
print(my_beetle.get_descriptive_name())
my_tesla=car.ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
my_tesla.battery.upgtade_battery()
my_tesla.battery.get_range()