• 创建类
  • 根据累创建
  • 访问属性
  • 调用方法
  • 练习
  • 使用类和实例
  • 给属性指定默认值
  • 修改属性的值
  • 直接修改属性的值
  • 通过方法修改属性
  • 通过方法对属性的值进行递增
  • 练习
  • 继承
  • 子类的方法__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

python 入门到实践 第18章 python从入门到实践练习_python