《Python编程从入门到实践》第9章 类

一、创建和使用类

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中,首字母大写的名称指的是类。这个类定义中的括号是空的,因为我们要从空白创建这个类。

①类中的函数称为方法。其中__init__()是一个特殊的方法,每当你根据Dog类创建新实例时,Python都会自动运行它。

在方法__init__()中,形参self必不可少,还必须位于其他形参的前面。因为Python调用这个__init__()方法来创建Dog实例时,将自动传入实参self,它是一个指向实例本身的引用。

通过实参向Dog传递名字和年龄;self会自动传递。因此当我们根据Dog类创建实例时,都只需要给最后两个形参(name和age)提供值。

②以self为前缀的变量都可供类中所有方法使用,我们还可以通过类的任何实例来访问这些变量。self.name=name获取存储在形参name中的值,并将其存储到变量name中,然后该变量被关联到当前创建的实例,像这样可通过实例访问的变量称为属性

2.根据类创建实例

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.')

在第一行代码中,Python使用实参'willie'和6调用Dog类中的方法__init__()。方法__init__()并未显式的包含return语句,但Python自动返回一个表示这条小狗的实例,我们将这个实例存储在变量my_dog中。

①访问属性

my_dog.name

②调用方法

my_dog.sit()
Willie is now sitting.

二、使用类和实例

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.read_odometer()
2016 Audi A4
This car has 0 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.')

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.

②通过方法修改属性的值

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

三、继承

一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

1.子类的方法__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.')

    def update_odometer(self,mileage): #用于修改属性
        '''将里程表读数设置为指定的值'''
        self.odometer_reading = mileage

class ElectricCar(Car): #子类
    '''电动汽车的独特之处'''

    def __init__(self,make,model,year):
        '''初始化父类的属性'''
        super().__init__(make,model,year)

my_tesla = ElectricCar('tesla','model S','2016')
print(my_tesla.get_descriptive_name())

创建子类时,父类必须包含在当前文件中,且位于子类前面。定义子类时,必须在括号内指定父类的名称。super()是一个特殊函数,帮助Python将父类和子类关联起来,让实例包含父类的所有属性。

2.给子类定义属性和方法

class ElectricCar(Car):
    '''电动汽车的独特之处'''

    def __init__(self,make,model,year):
        '''初始化父类的属性'''
        super().__init__(make,model,year)
        self.battery_size = 70 初始化电动汽车特有的属性

    def describe_battery(self):
        print('This car has a '+str(self.battery_size)+'-kwh battery.')

my_tesla = ElectricCar('tesla','model S','2016')
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
2016 Tesla Model S
This car has a 70-kwh battery.

根据ElectricCar类创建的所有实例都将包含这个属性,但所有Car实例都不包含它。

3.重写父类的方法

可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方法,而只关注子类中定义的相应方法。

4.将实例用作属性

可以将大型类拆分成多个协同工作的小类。

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

class Battery():
    '''一次模拟电动汽车电瓶的简单尝试'''
    def __init__(self,battery_size=70):
        '''初始化电瓶的属性'''
        self.battery_size = battery_size

    def describe_battery(self):
        print('This car has a '+str(self.battery_size)+'-kwh battery.')

class ElectricCar(Car):
    '''电动汽车的独特之处'''

    def __init__(self,make,model,year):
        '''初始化父类的属性'''
        super().__init__(make,model,year)
        self.battery = Battery() #将实例用作属性

    def describe_battery(self):
        print('This car has a '+str(self.battery_size)+'-kwh battery.')

my_tesla = ElectricCar('tesla','model S','2016')
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
2016 Tesla Model S
This car has a 70-kwh battery.

上例中将某些属性和方法提炼出来,放到另一个名为Battery的类中,并将一个Battery实例用作ElectricCar类的一个属性。

四、类编码风格

类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不是用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。

在类中,可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长得丑就要多读书

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值