Python编程从入门到实践(第七部分 类)

  • 用于面向对象编程
  • 定义这一大类对象的通用行为
  • 基于类创建对象的时候,每个对象都自动具备这种通用行为,然后根据需要赋予每个对象独特的个性

创建和使用类

# 创建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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值