类
- 创建类
- 根据累创建
- 访问属性
- 调用方法
- 练习
- 使用类和实例
- 给属性指定默认值
- 修改属性的值
- 直接修改属性的值
- 通过方法修改属性
- 通过方法对属性的值进行递增
- 练习
- 继承
- 子类的方法__init__()
- 单独给子类定义属性和方法
- 重新父类的方法
- 将实例用做属性
- 练习
- 导入类
- 导入单个类
- 在一个模块中储存多个类
- 从一个模块中导入多个类
- 导入整个模块
- 导入模块中的所有类
- 在一个模块中导入另一个模块
- 练习题
创建类
创建类就是创建对象,约定字母大写的名称是指类。类中的函数称为方法。可以通过实例访问的变量称为属性,如下例子的__init__函数里的name和age方法。
class Dog:
"""A simple attempt to model a dog."""
def __init__(self, name, age):
"""Initialize name and age attributes."""
self.name = name
self.age = age
def sit(self):
"""Simulate a dog sitting in response to a command."""
print(f"{self.name} is now sitting.")
def roll_over(self):
"""Simulate rolling over in response to a command."""
print(f"{self.name} rolled over!")
创建了一个Dog的类
init()方法是个特殊方法,两边加下划线的方法都是特殊方法,还有是在前边加一个下划线的方法,Python解释器见到这里名称会知道他们的作用
init()方法有三个参数,其中self参数必须有,当实例化对象的时候就自动传入
根据累创建
my_dog = Dog('Willie', 6)
上边代码就是实例化过程。并把两个参数传给相应的属性。
上边类还包括两个方法sit()和roll_over()。这里函数只有一个打印语句,在项目中,方法中打印语句可以拓展成小狗蹲下和打滚动画效果的代码,或者在一个控制机器狗的项目中包含让实物狗动起来的代码。
访问属性
my_dog.name
调用方法
your_dog.sit()
练习
class User:
"""用户信息"""
# def __init__(self,first_name,last_name,sex,age=None):
def __init__(self,*arg):
self.first_name=arg[0]
self.last_name=arg[1]
self.sex=arg[2]
self.age=arg[3]
def describe_user(self):
name=f"{self.first_name}{self.last_name}"
print(f"{name} is a {self.age} years {self.sex}")
def greet_user(self):
name=f"{self.first_name}{self.last_name}"
print(f"Hello,{name}")
person=User('li','Xiaoing','boy','18')
person.greet_user()
person.describe_user()
输出
Hello,liXiaoing
liXiaoing is a 18 years boy
使用类和实例
修改类的属性有几种方法
给属性指定默认值
在创建实例的时候,有些属性无需定义,可在__init__()方法中指定其默认值
def __init__(self,first_name,last_name,sex,age=None):
self.first_name=first_name
self.last_name=last_name
self.sex=sex
self.age=22
上边属性age值就是默认的。
修改属性的值
直接修改属性的值
通过实例化对象调用属性来修改属性的值
class Car:
"""A simple attempt to represent a car."""
def __init__(self, make, model, year):
"""Initialize attributes to describe a car."""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
my_car=Car('1','2','3')
my_car.odometer=22
通过方法修改属性
下面例子就把默认的属性修改为23
def update_odometer(self, mileage):
self.odometer=23
通过方法对属性的值进行递增
练习
# -*- coding: utf-8 -*-
"""
Created on Sat Apr 10 10:18:06 2021
@author: hellohaojun
"""
class Restaurant:
def __init__(self,restaurant_name,cuisine_type):
self.restaurant_name=restaurant_name
self.cuisine_type=cuisine_type
self.number_served=0
def set_number_served(self,number_served):
self.number_served=number_served
print(f"{self.number_served} person are ate in the restaurant")
def increment_number_served(self,up_num):
self.number_served+=up_num
print(f"{self.number_served} person are ate in the restaurant")
def describe_restaurant(self):
print(f"the restaurant's name is {self.restaurant_name}")
def open_restaurant(self):
print(f"{self.restaurant_name} is opening")
my_restaurant=Restaurant('米其林三星','west_type')
my_restaurant.describe_restaurant()
my_restaurant.open_restaurant()
my_restaurant.set_number_served(200)
my_restaurant.increment_number_served(200)
继承
一个类继承另一个时,将自动获得另一个类的所有属性和方法。原有的类称为父类,新类称为子类,子类继承父类的所有属性和方法,同时还可以定义自己的属性和方法。
子类的方法__init__()
class Car:
"""A simple attempt to represent a 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 = 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.")
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):
"""Represent aspects of a car, specific to electric vehicles."""
def __init__(self, make, model, year):
super().__init__(make, model, year)
my_tesla = ElectricCar('tesla', 'model s', 2019)
print(my_tesla.get_descriptive_name())
子类的__init__()方法接受父类的属性信息,super()是特殊函数,让子类可以调用父类的方法,让Python可以调用父类的方法__init__(),子类拥有父类所有的属性`包括那些默认的属性
单独给子类定义属性和方法
就在子类的__init__()方法里边,像父类一样定义属性
重新父类的方法
子类从父类那里继承来的属性和方法,并不是子类所需要的,那么就需要重新父类的方法,把父类中的方法属性的名字用在子类中,这样在调用相应方法的时候,Python就会忽略掉父类中的方法,调用自类中的同名方法
将实例用做属性
在项目编写中,可以把一个大类分为几个小类,然后在类中把小类的实例化看作属性。
class Car:
--snip--
class Battery:
--snip--
class ElectricCar:
def __init__(self,make,modle,year):
super().__init__(make,modle,year)
self.battery=Battery()
my_tesla=ElectricCar('key1','key2','key3')
my_tesla.battery.describe_battery()
练习
# -*- coding: utf-8 -*-
"""
Created on Sat Apr 10 10:18:06 2021
@author: hellohaojun
"""
class Restaurant:
def __init__(self,restaurant_name,cuisine_type):
self.restaurant_name=restaurant_name
self.cuisine_type=cuisine_type
self.number_served=0
self.flavors=[]
def add_flavors(self,*args):
for arg in args:
self.flavors.append(arg)
print(f"I like some tastes:")
for taste in self.flavors:
print(f"\t{taste}")
def set_number_served(self,number_served):
self.number_served=number_served
print(f"{self.number_served} person are ate in the restaurant")
def increment_number_served(self,up_num):
self.number_served+=up_num
print(f"{self.number_served} person are ate in the restaurant")
def describe_restaurant(self):
print(f"the restaurant's name is {self.restaurant_name}")
def open_restaurant(self):
print(f"{self.restaurant_name} is opening")
my_restaurant=Restaurant('米其林三星','west_type')
my_restaurant.add_flavors('banana','apple','orange')
导入类
将类储存在模块中,然后在主程序中导入所需的模块
导入单个类
在一个模块中储存多个类
从一个模块中导入多个类
导入整个模块
导入模块中的所有类
在一个模块中导入另一个模块
import restaurant
my_restaurant=restaurant.Restaurant('米其林三星','west_type')
my_restaurant.add_flavors('banana','apple','orange')
from restaurant import Restaurant
my_restaurant=Restaurant('米其林三星','west_type')
注意导入的区别
练习题
# -*- coding: utf-8 -*-
"""
Created on Sat Apr 10 14:16:47 2021
@author: hellohaojun
"""
from random import randint
class Die:
def __init__(self,sides=6):
self.sides = sides
def roll_die(self):
out_side=randint(1,self.sides)
print(out_side)
Die_2=Die(2)
Die_10=Die(10)
Die_2.roll_die()
Die_10.roll_die()
from random import randint
list = [1,2,3,4,5,6,7,8,9,10,'a','b','c','d','e']
for i in range(1,5):
a=randint(1,len(list))
print(list[a])
from random import randint
end_ticket=[1,2,'a','b']
my_ticket=[]
list = [1,2,3,4,5,6,7,8,9,10,'a','b','c','d','e']
num=0
while True:
for i in range(1,5):
a=randint(1,len(list))
my_ticket.append(a)
num+=1
if my_ticket == end_ticket:
print(f"I have brought {num} times")
break
else:
pass