python_类


面向对象编程。——类

1创建和使用类

1.1创建dog类

类中的函数称为方法,方法和函数唯一重要差别为调用方法的方法。
__init__()是一个特殊方法。当根据类Dog创建新实例时,Python都会自动运行它。
此方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免python默认方法和普通方法发生名称冲突。
方法__init__()中的形参self必不可少,且必须位于其他形参的前面。
每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。self会自动传递。

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

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

if __name__ == "__main__":
    my_dog = Dog('xiaobai',12)

    print("My dog's name is " + my_dog.name.title() + ".")
    print("My dog is " + str(my_dog.age) + "years old.")

在这里插入图片描述

  1. 访问属性
    属性类似于一般函数中的变量
    访问实例的属性使用句点表示法,访问my_dog的属性name的值:
my_dog.name
  1. 调用方法
    类中函数即为类中方法。
if __name__ == "__main__":
    my_dog = Dog('xiaobai',12)

    print("My dog's name is " + my_dog.name.title() + ".")
    print("My dog is " + str(my_dog.age) + "years old.")

    my_dog.sit()
    my_dog.roll_over()

在这里插入图片描述
3. 创建多个实例

if __name__ == "__main__":
    # 第一个实例
    my_dog = Dog('xiaobai',12)

    print("My dog's name is " + my_dog.name.title() + ".")
    print("My dog is " + str(my_dog.age) + "years old.")

    my_dog.sit()
    my_dog.roll_over()

    #第二个实例
    my_dog = Dog('dahuang',6)

    print("\nYour dog's name is " + my_dog.name.title() + ".")
    print("Your dog is " + str(my_dog.age) + "years old.")

    my_dog.sit()
    my_dog.roll_over()

在这里插入图片描述

2使用类和实例

2.1car类

class Car():
    """一次模拟汽车的简单尝试"""
    def __init__(self, make, modol, year):
        """初始化描述汽车的属性"""
        self.make = make
        self.modol = modol
        self.year = year

    def get_descriptive_name(self):
        """返回整洁的描述信息"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.modol
        return long_name.title()

if __name__ == "__main__":
    my_new_car = Car('audi', 'a4', 2016)
    print(my_new_car.get_descriptive_name())

在这里插入图片描述

2.2给属性指定默认值

类中每一个属性都必须有初始值,哪怕这个值是0或者字符串。
如设置默认值时,在方法__init__()内指定这种初始值是可行的;如果对某个属性这样做了,就无需包含为它提供初始值的实参。
在Car类中添加名为odometer_reading的属性,其初始值是0。

class Car():
    """一次模拟汽车的简单尝试"""
    def __init__(self, make, modol, year):
        """初始化描述汽车的属性"""
        self.make = make
        self.modol = modol
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        """返回整洁的描述信息"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.modol
        return long_name.title()

    def read_odometer(self):
        """打印一条汽车里程的消息"""
        print("This car has " + str(self.odometer_reading) + " miles on it.")

if __name__ == "__main__":
    my_new_car = Car('audi', 'a4', 2016)
    print(my_new_car.get_descriptive_name())
    my_new_car.read_odometer()

在这里插入图片描述

2.3修改属性的值

2.3.1直接通过实例修改

class Car():
	--snip--   # 剪贴

if __name__ == "__main__":
    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()

在这里插入图片描述

2.3.2通过方法修改属性的值

class Car():
   --snip--

    def update_odometer(self, mileage):
        """将里程表读书设置为指定的值
        禁止将里程表读数往回调"""

        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back the odometer.")

if __name__ == "__main__":
    my_new_car = Car('audi', 'a4', 2016)
    print(my_new_car.get_descriptive_name())
    my_new_car.update_odometer(25)
    my_new_car.read_odometer()

在这里插入图片描述

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

class Car():
    """一次模拟汽车的简单尝试"""
    def __init__(self, make, modol, year):
        """初始化描述汽车的属性"""
        self.make = make
        self.modol = modol
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        """返回整洁的描述信息"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.modol
        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 the odometer.")

    def increment_odometer(self,miles):
        """将里程表读数增加指定的量"""
        self.odometer_reading += miles

if __name__ == "__main__":
    my_new_car = Car('audi', 'a4', 2016)
    print(my_new_car.get_descriptive_name())
    my_new_car.update_odometer(23500)
    my_new_car.read_odometer()

    my_new_car.increment_odometer(100)
    my_new_car.read_odometer()

3继承

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

3.1子类的方法__init__()

错误代码:

from car import Car

class ElectricCar(Car):
    """电车的独特之处"""

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

错误提示:
Traceback (most recent call last):
File “F:\python\car\main.py”, line 14, in
my_tesla = ElectricCar(‘tesla’, ‘model s’, 2016)
File “F:\python\car\electric_car.py”, line 8, in init
super().init(self, make, model, year)
TypeError: init() takes 4 positional arguments but 5 were given

进程已结束,退出代码1
错误原因:继承父类属性时__init__位置参数不需要再加self
正确代码 electric.py

from car import Car

class ElectricCar(Car):
    """电车的独特之处"""

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

main.py中代码:

from car import Car
from electric_car import ElectricCar

if __name__ == "__main__":

    my_new_car = Car('audi', 'a4', 2016)
    print(my_new_car.get_descriptive_name())
    my_new_car.update_odometer(23500)
    my_new_car.read_odometer()

    my_new_car.increment_odometer(100)
    my_new_car.read_odometer()

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

在这里插入图片描述

3.2给子类定义属性和方法

让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法
electric.py

from car import Car

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

main.py

from car import Car
from electric_car import ElectricCar

if __name__ == "__main__":

    my_new_car = Car('audi', 'a4', 2016)
    print(my_new_car.get_descriptive_name())
    my_new_car.update_odometer(23500)
    my_new_car.read_odometer()

    my_new_car.increment_odometer(100)
    my_new_car.read_odometer()

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

3.3重写父类的方法

electric.py
假设Car类有fill_gas_tank方法,则在ElectricCar类中重写此方法后,使用继承时,会覆盖Car类中的方法。

在这里插入代码片from car import Car

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

    def fill_gas_tank(self):
        """电动车没有油箱"""
        print("此车没有油箱。")

3.4将实例用做属性

定义一个新类Battery,并将Battery实例用作ElectricCar类的一个属性。
electric.py

from car import Car

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_size = Battery()



    def fill_gas_tank(self):
        """电动车没有油箱"""
        print("此车没有油箱。")

main.py

from car import Car
from electric_car import ElectricCar

if __name__ == "__main__":

    my_new_car = Car('audi', 'a4', 2016)
    print(my_new_car.get_descriptive_name())
    my_new_car.update_odometer(23500)
    my_new_car.read_odometer()

    my_new_car.increment_odometer(100)
    my_new_car.read_odometer()

    my_tesla = ElectricCar('tesla', 'model s', 2016)
    print(my_tesla.get_descriptive_name())
    my_tesla.battery_size.describe_battery()   ###改动之处
    my_tesla.fill_gas_tank()

4导入类

和导入函数的方法类似。

4.1导入单个类

from module_name import ClassName

4.2从一个模块中导入多个类

from mudule_name import ClassName1, ClassName2, ClassName3

4.3导入整个模块

import mudule_name

## 调用类
A = mudule.ClassName1()

4.4导入模块中所有类

from module_name import *

5Python标准库

标准库为其他人员编写好的模块,可使用标准快中的任何函数和类。

6类编码风格

类名使用驼峰命名法,即类中每个单词的首字母都大写,而不是用下划线。如ElectricCar
实例名(变量)和模块名(单个.py文件)都用小写格式,并在单词之间加下划线。
类中使用一个空行分隔方法(函数),
在模块中用两个空行分隔类。

  • 16
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值