Python编程:从入门到实践-第9章类

9.类

9.1创建类

9.1.1定义类

  类是一种用户自定义的数据类型,它可以表示具有相同属性和方法的对象的集合。在创建类的实例之前,需要先定义类。类通常使用关键字class来定义,类名通常使用首字母大写的驼峰命名法,类的定义一般包括属性和方法。简单示例如下:

class MyClass:
    #类的属性
    my_attribute = 0

    #类的方法
    def my_method(self):
        print('Hello world!')

9.1.2类的方法

  类中的函数称为方法,有关函数的一切都适用于方法,唯一的差别是调用方法的方式。在类中定义方法时,需要在方法名前面添加一个self参数,它代表实例本身。在9.1.1的示例中,my_method是一个类的方法,它可以通过实例来调用。
  在类中,有一个特殊的方法,即__init__(),它是在创建类之后通常会自动创建的一个方法。注意,在方法的名称中开头和末尾各有两个下划线。另外,init()方法必须包含一个名为self的参数,且必须位于其他形参的前面。,这个参数是实例本身的应用,可以用来访问类中的属性和方法。在__init__()方法中,可以设置实例的初始状态,定义实例的行为和行为规则。
  现在我们来创建一个小狗类,在其中存储小狗的名字和年龄,并且赋予每条小狗蹲下和打滚的能力。示例如下:

class Dog:

    def __init__(self,name,age):
        #获取与形参name相关联的值并将其赋值给变量name
        self.name = name
        self.age = age

    def sit(self):
        print(f'{self.name} is now sitting.')

    def roll_over(self):
        print(f'{self.name} rolled over!')

9.1.3根据类创建实例

在完成类的定义后,实际上并不会立即创建一个实例。这就像是一份汽车的蓝图。蓝图可以展示汽车的外观,但本身并不是一辆汽车。你无法直接驾驶蓝图,它只能用来指导真正汽车的建造,而且可以用它来制造多个汽车实例。**类的实例化:在创建类的实例时,需要使用类名来调用。**简单示例如下:

class Dog:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def sit(self):
        print(f'{self.name} is now sitting.')

    def roll_over(self):
        print(f'{self.name} rolled over!')

#创建一个名为my_dog的类的实例,并将它分配给变量my_dog
my_dog = Dog('Willie',6)

print(f"My dog's name is {my_dog.name}.")
print(f"My dog is {my_dog.age} years old.")

1、访问属性
使用句点表示法来访问属性。例如在上例中访问my_dog的属性name的值所使用的代码为;

my_dog.name

在这里,python会先找到实例my_dog,再查找与该实例相关联的属性name。对于上例,输出结果为:

My dog's name is Willie.
My dog is 6 years old.

2、调用方法
调用方法同样还是使用句点表示法。具体操作为:指定实例的名称和要调用的方法,并用句点分隔。对于上述创建的Dog类,调用坐下和打滚方法,示例如下:

class Dog:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def sit(self):
        print(f'{self.name} is now sitting.')

    def roll_over(self):
        print(f'{self.name} rolled over!')

#创建一个名为my_dog的类的实例,并将它分配给变量my_dog
my_dog = Dog('Willie',6)
my_dog.sit()
my_dog.roll_over()

此时python会在Dog类中查找方法sit()和roll_ove()并运行其代码。输出结果为:

Willie is now sitting.
Willie rolled over!

3、创建多个实例
可以根据需求创建任意数量的实例,例如对于Dog类再创建一个your_dog的小狗实例:

class Dog:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def sit(self):
        print(f'{self.name} is now sitting.')

    def roll_over(self):
        print(f'{self.name} rolled over!')

my_dog = Dog('Willie',6)
your_dog = Dog('Tom',3)

print(f"My dog's name is {my_dog.name}.")
print(f"My dog is {my_dog.age} years old.")
my_dog.sit()

print(f"Your dog's name is {your_dog.name}.")
print(f"Your dog is {your_dog.age} years old.")
your_dog.sit()

输出结果为:

My dog's name is Willie.
My dog is 6 years old.
Willie is now sitting.

Your dog's name is Tom.
Your dog is 3 years old.
Tom is now sitting.

9.2使用类和实例

9.2.1给属性指定默认值

创建实例时,有些属性无须通过形参来定义,可在方法__init__()中为其指定默认值。示例如下:

class Car:
    def __init__(self,make,model,year):
        self.make = make
        self.model = model
        self.year = year
        #添加名为odometer_reading的属性,其初始值总为0
        self.odometer_reading = 0

    def get_descriptive_name(self):
        long_name = f'{self.year} {self.make} {self.model}'
        return long_name.title()

    #添加名为read_odometer的方法
    def read_odometer(self):
        print(f'This car has {self.odometer_reading} miles on it.')
    
my_new_car = Car('audi','a4','2019')
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()

输出结果为:

2019 Audi A4
This car has 0 miles on it.

9.2.2修改属性的值

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 = 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.')
    
my_new_car = Car('audi','a4','2019')
print(my_new_car.get_descriptive_name())
#直接讲里程表读数设置更改为23
my_new_car.odometer_reading = 23
my_new_car.read_odometer()

此时输出结果已经变为:

2019 Audi A4
This car has 23 miles on it.

2、通过方法修改属性的值
使用update方法,示例如下:

class Car:
    def __init__(self,make,model,year):
        self.make = make
        self.model = model
        self.year = year
        #添加名为odometer_reading的属性,其初始值总为0
        self.odometer_reading = 0

    def get_descriptive_name(self):
        long_name = f'{self.year} {self.make} {self.model}'
        return long_name.title()

    #添加名为read_odometer的方法
    def read_odometer(self):
        print(f'This car has {self.odometer_reading} miles on it.')

    def update_odometer(self,mileage):
        self.odometer_reading = mileage
    
my_new_car = Car('audi','a4','2019')
print(my_new_car.get_descriptive_name())

#使用update
my_new_car.update_odometer(23)
my_new_car.read_odometer()

此时输出结果第一种方法。
3、通过方法对属性的值进行递增
有时候需要将属性值递增特定的量,而不是将其设置为全新的值。示例如下:

class Car:
    def __init__(self,make,model,year):
        self.make = make
        self.model = model
        self.year = year
        #添加名为odometer_reading的属性,其初始值总为0
        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):
        self.odometer_reading = mileage

    #新增方法接受一个单位为英里的数
    def increment_odometer(self,miles):
        self.odometer_reading += miles
    
my_used_car = Car('subaru','outback','2015')
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()

输出结果如下:

2015 Subaru Outback
This car has 23500 miles on it.
This car has 23600 miles on it.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值