类
- 用于面向对象编程
- 定义这一大类对象的通用行为
- 基于类创建对象的时候,每个对象都自动具备这种通用行为,然后根据需要赋予每个对象独特的个性
创建和使用类
# 创建Dog类
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("doudou",20)# 创建实例
# 访问属性
print("My dog name is "+my_dog.name.title()+".")
print("My dog is "+str(my_dog.age)+" years old.")
# 调用方法
my_dog.sit()
my_dog.roll_over()
# 9-1餐馆
class restaurant():
def __init__(self, restaurant_name, cuisine_type):
self.restaurant_name = restaurant_name
self.cuisine_type = cuisine_type
def describe_restaurant(self):
print("The name of restaurant is "+self.restaurant_name.title()+" and it has "+self.cuisine_type) # TypeError: can only concatenate str (not "builtin_function_or_method") to str
def open_restraurant(self):
print("The restaurant is now opening.")
my_restaurant = restaurant("qiqizhuzhou","rishiiaoli")
print("My restaurant name is "+my_restaurant.restaurant_name )
print("It has "+my_restaurant.cuisine_type)
my_restaurant.describe_restaurant()
my_restaurant.open_restraurant()
# 用户
class user():
def __init__(self,first_name,last_name):
self.first_name = first_name
self.last_name = last_name
def describe_user(self):
print("Username is "+self.first_name.title()+self.last_name)
def greet_user(self):
print("Hello "+self.first_name.title())
my_name = user("Guo","Xinqi")
print("My name is "+my_name.first_name.title()+" "+my_name.last_name+".")
my_name.describe_user()
my_name.greet_user()
# 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 = 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())
# 给属性指定默认值
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()
# 修改属性的值
my_new_car.odometer_reading = 44
my_new_car.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.")
def update_odometer(self,mileage):
self.odometer_reading = mileage
my_new_car = Car("audi","a4",2016)
my_new_car.update_odometer(36)
my_new_car.read_odometer()
# 9-4就餐人数
class restaurant():
def __init__(self, restaurant_name, cuisine_type):
self.restaurant_name = restaurant_name
self.cuisine_type = cuisine_type
self.serving_number = 0
def describe_restaurant(self):
print("The name of restaurant is "+self.restaurant_name.title()+" and it has "+self.cuisine_type) # TypeError: can only concatenate str (not "builtin_function_or_method") to str
def open_restraurant(self):
print("The restaurant is now opening.")
def number_served(self,number):
self.serving_number = number
def increment_number(self,increse_number):
self.serving_number+=increse_number
my_restaurant = restaurant("qiqizhuzhou","rishiiaoli")
# 9-5尝试登陆次数
class user():
def __init__(self,first_name,last_name):
self.first_name = first_name
self.last_name = last_name
self.login_attempt = 0
def describe_user(self):
print("Username is "+self.first_name.title()+self.last_name)
def greet_user(self):
print("Hello "+self.first_name.title())
def increment_login_attempts(self):
self.login_attempt +=1
def reset_login_attempts(self):
self.login_attempt = 0
my_name = user("Guo","Xinqi")
# print("My name is "+my_name.first_name.title()+" "+my_name.last_name+".")
# my_name.describe_user()
# my_name.greet_user()
my_name.increment_login_attempts()
my_name.increment_login_attempts()
print("My login times are "+ str(my_name.login_attempt))
my_name.reset_login_attempts()
print("My login times are "+ str(my_name.login_attempt))
继承
- 编写类的时候不需要从头开始
- 可以当成另一个类的特殊版本——继承
- 子类继承了父类的所有属性和方法,同时可以自己定义自己的属性和方法
# 继承
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)
my_new_car.update_odometer(36)
my_new_car.read_odometer()
class ElectricCar(Car):
def __init__(self,make,modle,year):# 初始化父类的属性
super().__init__(make,modle,year)# 这里帮助把父类和子类连接起来(因为父类也叫superclass)
my_tesla = ElectricCar('tesla',"model s",2016)
print(my_tesla.get_descriptive_name())
# 给子类定义属性和方法
class ElectricCar(Car):
def __init__(self,make,modle,year):# 初始化父类的属性
super().__init__(make,modle,year)# 这里帮助把父类和子类连接起来(因为父类也叫superclass)
self.battary_size = 70
def describe_battary(self):
print("This car has a "+str(self.battary_size)+"KWh battary.")
my_tesla = ElectricCar('tesla',"model s",2016)
my_tesla.describe_battary()
# 重写父类的方法——也就是子类和父类不同的地方该怎么处理
# 可以在子类中定义一种方法,他与父类中的方法重名
#
# 将实例用作属性
#
# 也就是将一个类进行拆分
# 9-6冰淇淋小店
class restaurant():
def __init__(self, restaurant_name, cuisine_type):
self.restaurant_name = restaurant_name
self.cuisine_type = cuisine_type
self.serving_number = 0
def describe_restaurant(self):
print("The name of restaurant is "+self.restaurant_name.title()+" and it has "+self.cuisine_type) # TypeError: can only concatenate str (not "builtin_function_or_method") to str
def open_restraurant(self):
print("The restaurant is now opening.")
def number_served(self,number):
self.serving_number = number
def increment_number(self,increse_number):
self.serving_number+=increse_number
class IceCreamStand(restaurant):
def __init__(self, restaurant_name, cuisine_type):
super().__init__(restaurant_name, cuisine_type)
self.flavors = ["apple","cookies","chocolate","peanut"]
def show_flavor(self):
for flavor in self.flavors:
print(flavor)
my_stand = IceCreamStand("QQ","icecream")
my_stand.show_flavor()
# # 9-7管理员
class user():
def __init__(self,first_name,last_name):
self.first_name = first_name
self.last_name = last_name
def describe_user(self):
print("Username is "+self.first_name.title()+self.last_name)
def greet_user(self):
print("Hello "+self.first_name.title())
class Admin(user):
def __init__(self,first_name,last_name):
super().__init__(first_name,last_name)
self.first_name = first_name
self.last_name = last_name
self.privileges = "can be post"
def show_privileges(self):
print("He "+self.privileges)
new_admin = Admin("Guo","xinqi")
new_admin.show_privileges()
# 权限 把实例用作属性好像有一些问题,战术放弃吧
class privileges():
def __init__(self):
self.privileges = "can be post"
def show_privileges(self):
print(privileges)
class Admin(user):
def __init__(self,first_name,last_name):
super().__init__(first_name,last_name)
self.first_name = first_name
self.last_name = last_name
self.privileges = privileges()
new_admin_1 = Admin("Guo","xinqi")
new_admin_1.privileges.show_privileges()
导入类
- 不断给类添加功能的过程中,文件会变得很长
- python允许将类储存在模块中,然后在主程序导入相应的模块
- 等于把类当做底层逻辑放在一个代码中,这样就可以专注于高级逻辑部分了
# 导入单个类
from car import Car
# 在一个模块中可以储存多个类(主类子类放在一起)
# 一个模块导入多个类
from car import Car,ElectricCar
# 导入整个模块
import Car
# 导入模块的所有类(不推荐)
from car import *
工作中先尽可能的在一个文件中完成所有工作,确定一切正常运行之后再将类转移到独立的模块中去,再尝试有序组织代码
Python标准库
- python的标准库是一系列模块,掌握了上面的知识就可以使用其他程序员写好的模块了
- 可以使用其他人写好的函数和类,只要在程序开头写上import语句
from random import randint
class Die():
def __init__(self,side = 6):
self.side = side
def roll_die(self):
print("骰子的点数是: "+str(randint(1,self.side)))
def roll_many_times(self,times):
self.n = 0
self.time = 10
while self.n<self.time:
self.roll_die()
self.n+=1
new_die = Die(20)
new_die.roll_many_times(20)
new_die.roll_die()