Day 5 of Learning Python

在这里插入图片描述

Chatper 9 类

9.1 创建和使用类

9.1.1 创建Dog类

class Dog():"""一次模拟小狗的简单尝试"""def _init_(self, name, age):
        """初始化属性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!")

在❶处,我们定义了一个名为Dog 的类。根据约定,在Python中,首字母大写的
名称指的是类。这个类定义中的括号是空的,因为我们要从空白创建这个类。在❷处,我们编写了一个文档字符串,对这个类的功能作了描述。

  1. 方法_init_()
    类中的函数成为方法;❸处的方法__init__() 是一个特殊的方法,每当你根据Dog 类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。
    我们将方法__init__() 定义成了包含三个形参:self 、name 和age 。在这个方法的定义中,形参self 必不可少,还必须位于其他形参的前面。为何必须在方法定义中包
    含形参self 呢?因为Python调用这个__init__() 方法来创建Dog 实例时,将自动传入实参self 。每个与类相关联的方法调用都自动传递实参self ,它是一个指向实例本身
    的引用,让实例能够访问类中的属性和方法。我们创建Dog 实例时,Python将调用Dog 类的方法__init__() 。我们将通过实参向Dog() 传递名字和年龄;self 会自动传递,因此我们不需要传递它。每当我们根据Dog 类创建实例时,都只需给最后两个形参(name 和age )提供值。❹处定义的两个变量都有前缀self 。以self 为前缀的变量都可供类中的所有方法使用,我们还可以通过类的任何实例来访问这些变量。self.name = name 获取存储在形参name 中的值,并将其存储到变量name 中,然后该变量被关联到当前创建的实例。self.age = age 的作用与此类似。像这样可通过实例访问的变量称为属性 。Dog 类还定义了另外两个方法:sit() 和roll_over() (见❺)。由于这些方法不需要额外的信息,如名字或年龄,因此它们只有一个形参self 。我们后面将创建的实例能够访问这些方法,换句话说,它们都会蹲下和打滚。

9.1.2 根据类创建实例

class Dog():
    """一次模拟小狗的简单尝试"""
    
    def __init__(self, name, age):
        """初始化属性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 is "+str(my_dog.age)+" years old.")
my_dog.roll_over()

My dog’s name is Willie.
My dog is 6 years old.
Willie rolled over!
要访问实例的属性,可使用句点表示法。使用句点还可调用Dog类中定义的任何方法。
练习题9-1~9-3

class Restaurant():
    def __init__(self,name,cuisine_type):
        self.name=name
        self.cuisine_type=cuisine_type
    
    def describe_restaurant(self):
        print("name of the restaurant: " + self.name)
        print('cuisine type: ' + self.cuisine_type)
    def open_restaurant(self):
        print("The restaurant is running.")
        
test=Restaurant('zhang','big')
print(test.name)
print(test.cuisine_type)
test.describe_restaurant()
test.open_restaurant()
class User():
    def __init__(self,first_name,last_name,age):
        self.first_name=first_name
        self.last_name=last_name
        self.age=age
        
    def describe_user(self):
        print("first name:" + self.first_name)
        print("last name:" + self.last_name)
        print("age: " + str(self.age))
        
    def greet_user(self):
        print("Hello " + self.first_name + " " + self.last_name + "!")
        
test=User("wang","gabage",'11')
print(test.first_name + " " + test.last_name)
test.describe_user()
test.greet_user()

9.2.2 给属性指定默认值

类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。在有些情况下,如设置默认值时,在方法__init__() 内指定这种初始值是可行的;如果你对某个属性这样做
了,就无需包含为它提供初始值的形参。

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()

2016 Audi A4
this car has 0 miles on it.

9.2.3 修改属性的值

可以以三种不同的方式修改属性的值:直接通过实例进行修改;通过方法进行设置;通过方法进行递增(增加特定的值)。
1.直接修改属性的值

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.odometer_reading = 23
my_new_car.read_odometer()

2016 Audi A4
this car has 23 miles on it.
2.通过方法修改属性的值

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):
        """将里程表读数设置为指定的值,禁止将里程表读数回调"""
        if mileage >= self.odometer_reading:
            self.odometer_reading=mileage
        else:
            print("You can't roll back an odometer!")
    
my_new_car=Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(23)
my_new_car.read_odometer()

2016 Audi A4
this car has 23 miles on it.
3.通过方法对属性的值进行递增

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):
        """将里程表读数设置为指定的值,禁止将里程表读数回调"""
        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_used_car=Car('subaru','outback',2013)
print(my_used_car.get_descriptive_name())

my_used_car.update_odometer(23500)
my_used_car.read_odometer()

my_used_car.increment_odometer(100)
my_used_car.read_odometer()

2013 Subaru Outback
this car has 23500 miles on it.
this car has 23600 miles on it.
练习题9-4~9-5

class Restaurant():
    def __init__(self,name,cuisine_type):
        self.name=name
        self.cuisine_type=cuisine_type
        self.number_served=0
    
    def describe_restaurant(self):
        print("name of the restaurant: " + self.name)
        print('cuisine type: ' + self.cuisine_type)
    def open_restaurant(self):
        print("The restaurant is running.")
    
    def people(self):
        print("number serverd: " + str(self.number_served))
        
    def increase_people(self,people):
        self.number_served += people
test=Restaurant('zhang','big')
print(test.name)
print(test.cuisine_type)
test.describe_restaurant()
test.open_restaurant()

test.people()

test.increase_people(10)
test.people()
class User():
    def __init__(self,first_name,last_name,age):
        self.first_name=first_name
        self.last_name=last_name
        self.age=age
        self.login_attempts=0
        
    def describe_user(self):
        print("first name:" + self.first_name)
        print("last name:" + self.last_name)
        print("age: " + str(self.age))
        
    def greet_user(self):
        print("Hello " + self.first_name + " " + self.last_name + "!")
        
    def login_increment_login_attempts(self):
        self.login_attempts += 1
        
    def reset_login_attemts(self):
        self.login_attempts = 0
        print("The login attempts has been reset")
        
test=User("wang","gabage",'11')
print(test.first_name + " " + test.last_name)
print(test.login_attempts)
test.login_increment_login_attempts()
test.login_increment_login_attempts()
print(test.login_attempts)
test.reset_login_attemts()
print(test.login_attempts)

9.3 继承

编写类时,并非总是要从空白开始。如果你要编写的类时另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类成为父类,新类称为子类。子类继承了其父类的所有属性和方法,同时还可以 定义自己的属性和方法。
创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法__init__() 需要父类施以援手。例如,下面来模拟电动汽车。电动汽车是一种特殊的汽车,因此我们可以在前面创建的Car 类的基础上创建新类ElectricCar ,这样我们就只需为电动汽车特有的属性和行为编写代码。

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值