python学习之创建和使用类

Posted 码海小虾米_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习之创建和使用类相关的知识,希望对你有一定的参考价值。

1. 创建类

根据小狗创建dog类,每个实例都将存储名字和年龄,如何赋予了每条小狗“”吃“的能力”和“跑的能力”:
解析如下:
1.class Dog:在python中,首字母大写的名称指的是类,类定义没有圆括号;
2.注释部分为描述这个类的主要功能;
3. 特殊的方法_init_()定义为包含三个形参:self、name和age,每当根据Dog类创建新实例时,python都会运行,开头和末尾都需要有两个下划线
4. self.name和self.name两个变量都有self,以self为前缀的变量可供类中的所有方法使用,像这样可通过实例访问的变量称为属性
5. Dog还定了两个方法eat()和run(),这些方法的执行不需要额外的信息,因此只有一个形参sdle。

class Dog:
    # 这是一个dog类
    def __init__(self, name, age):
        # 初始化属性name和age
        self.name = name
        self.age = age

    def eat(self):
        # 吃的方法
        print(f"{self.name}吃东西....")

    def run(self):
        # 跑的方法
        print(f"{self.name}跑起来....")

2. 根据类创建实例

2.1 访问属性

1.创建一条名为“pipi”,年龄6岁的小狗
2.my_dog.name:访问实例的属性,可使用句点表示法

my_dog = Dog('pipi', 6)

print(f"我的小狗叫{my_dog.name}")
print(f"它今年{my_dog.age}岁了。")

运行结果:

我的小狗叫pipi
它今年6岁了。

2.2 调用方法

根据Dog类创建好实例后,就可以使用句点表示法来调用Dog类中定义的方法了

my_dog.eat()
my_dog.run()

运行结果:

pipi吃东西....
pipi跑起来....

2.3 创建多个实例

这个类中创建了两个实例,分别名为“pipi”和“maomao”,每条小狗都是一个独立的实例,有自己的属性,能够执行相同的操作

my_dog = Dog('pipi', 6)
your_dog = Dog('maomao',3)

print(f"我的小狗叫{my_dog.name}")
print(f"它今年{my_dog.age}岁了。")
my_dog.eat()

print('\\n')    # 输出一个换行符,方便看结果

print(f"你的的小狗叫{your_dog.name}")
print(f"它今年{your_dog.age}岁了。")
your_dog.eat()

运行结果:

我的小狗叫pipi
它今年6岁了。
pipi吃东西....


你的的小狗叫maomao
它今年3岁了。
maomao吃东西...

注意:即使第二条小狗指定了同样的名字和年龄,python依然会根据Dog类创建另一个实例。

3. 使用类和实例

3.1 Phone类

编写一个手机Phone类,存储有关手机的信息,还有个汇总这些信息的方法
这里的Phone类,形参的值以及方法同上个Dog类的例子意思一样。

class Phone:
    """关于iphone的类"""

    def __init__(self, brand, version, year):
        """初始化phone的属性"""
        self.brand = brand
        self.version = version
        self.year = year

    def get_descriptive_name(self):
        """返回整洁的描述"""
        return f"{self.brand} {self.version} 年份:{self.year}"


my_phone = Phone('iphone', '12', 2020)
print(my_phone.get_descriptive_name())

运行结果:

iphone 12 年份:2020

3.2 给属性指定默认值

创建实例时,有些属性不需要通过形参来定义,可以在方法__init__()中为其指定默认值。
下面增加了一个服务时间的属性以及使用时间的方法

class Phone:
    """关于iphone的类"""

    def __init__(self, brand, version, year):
        """初始化phone的属性"""
        self.brand = brand
        self.version = version
        self.year = year
        self.service_time = 0

    def get_descriptive_name(self):
        """返回整洁的描述"""
        return f"{self.brand} {self.version} 年份:{self.year}"

    def dis_time(self):
    	"""显示手机使用时间"""
        return f"该手机已经使用 {self.service_time}小时了 "


my_phone = Phone('iphone', '12', 2020)
print(my_phone.get_descriptive_name())
print(my_phone.dis_time())

运行后python会创建一个名为dis_time( )方法,并将其初始值设置默认的0

iphone 12 年份:2020
该手机已经使用 0小时了 

3.3 修改属性的值

修改属性的方法有3种:直接通过实例进行修改,通过方法进行设置和通过方法进行递增(增加特定的值)

3.3.1 直接修改属性的值

my_phone = Phone('iphone', '12', 2020)
print(my_phone.get_descriptive_name())

my_phone.service_time = 100				#直接修改属性的值
print(my_phone.dis_time())

运行结果

iphone 12 年份:2020
该手机已经使用 100小时了 

3.3.2 通过方法修改属性的值

修改类中使用使用的方法,给该方法增加一个参数 hour

    def dis_time(self, hour):
        """显示手机使用时间"""
        self.service_time = hour
        return f"该手机已经使用 {self.service_time}小时了 "


my_phone = Phone('iphone', '12', 2020)
print(my_phone.get_descriptive_name())

print(my_phone.dis_time(200))

调用dis_time()方法时并提供实参200,结果如下:

iphone 12 年份:2020
该手机已经使用 200小时了 

使用if判断用户后面调用dis_time( )方法给入的实参是否正常,因为使用时间应该是越来越长,不可回调。修改dis_time()的方法如下:

def dis_time(self, hour):
    """显示手机使用时间"""
    if hour >= self.service_time:
        self.service_time = hour
        return f"该手机已经使用 {self.service_time}小时了 "
    else:
        return "不可以将时间往回调"

第二次调用传入的实参小于第一次的运行结果:

iphone 12 年份:2020
该手机已经使用 200小时了 
不可以将时间往回调

3.3.3 通过方法对属性的值进行递增

有时候需要属性值递增特定的量,而不是将其设置为全新的值,假设第一次调后时使用时间是1000小时,然后后面调用都是增加的值,增加add_time( )方法如下:

    def add_time(self, add_hour):
        self.service_time+=add_hour
        return f"该手机已经使用 {self.service_time}小时了 "


my_phone = Phone('iphone', '12', 2020)
print(my_phone.get_descriptive_name())

print(my_phone.dis_time(1000))
print(my_phone.add_time(100))

测试结果:

iphone 12 年份:2020
该手机已经使用 1000小时了 
该手机已经使用 1100小时了 

以上是关于python学习之创建和使用类的主要内容,如果未能解决你的问题,请参考以下文章

python学习之创建迭代器对象

Java学习之创建对象内存使用机制

Python面向对象学习之八,装饰器

Python学习之定制类

Python学习之八设计模式和异常

Python学习之抽象类详解