python基础-类

3380次阅读 100人点赞 作者: WuBin 发布时间: 2024-07-13 15:37:27
扫码到手机查看

类基础

创建一个类

# 类的首字母一定要大写
class Dog():
    # 每当创建新实例时,都会自动执行
    def __init__(self, name, age):
        # 初始化属性
        self.name = name
        self.age = age

    def sit(self):
        print(self.name.title() + '已经坐下了')

    def roll(self):
        print(self.name.title() + '打滚')

mydog = Dog('华晨宇',5)
mydog.sit()

在py中,首字母大写指的就是类。

类中的函数称为方法。__init__是一个特殊方法,每次Dog类创建新实例时,py都会自动运行它,前后的下划线是一个约定。避免与普通方法冲突。

__init__方法必须在形参中定义self,且必须位于第一个参数,位于其他参数前面。

PY调用__init__创建Dog实例时,将自动传入实参self,每个与类相关联的方法调用都自动传递实参self,他是一个指向实例本身的引用。让实例能够访问类找那个的属性和方法。

__init__并没有显示的return,py会自动返回一个实例,一般使用大写单词,比如Dog代表类,使用小写名称代表创建的类的实例。

print(mydog.name)

创建多个实例

mydog = Dog('花花',5)
yourdog = Dog('fuck', 36)

print(mydog.name)
print(yourdog.age)

使用类和实例

class Car():
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def get_desc_name(self):
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()
    
my_car = Car('nissan', 'xtral', 2021);
print(my_car.get_desc_name())

给属性指定默认值

def __init__(self, make, model, year):
        self....
        # 指定默认值
        self.odometer_reading = 0

可以通过外部直接修改

my_car = Car('nissan', 'xtral', 2021);
my_car.odometer_reading = 23
print(my_car.odometer_reading)

也可以使用内部方法修改

def update_odometer(self, meter):
        self.odometer_reading = meter

在外部使用

my_car.update_odometer(23)

每次调用方法时候,对odometer_reading属性递增指定值

def increment_odometer(self, meter):
        self.odometer_reading += meter

继承

一个类继承另一个类的时候,将获得另一个类的所有属性和方法,原有类叫做父类,新类叫做子类。子类还可以定义自己的属性和方法。

比如,新建一个电车类,继承父类Car

父类

class Car():
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        # 指定默认值
        self.odometer_reading = 0

    def get_desc_name(self):
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()
    
    def update_odometer(self, meter):
        self.odometer_reading = meter

    def increment_odometer(self, meter):
        self.odometer_reading += meter

子类

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

mytesla = ElectricCar('tesla', 'model s', 2016)

print(mytesla.get_desc_name())

创建子类实例时,py首先需要就是给父类的所有属性赋值。

注意,创建子类时,父类必须包含在当前文件中,且位于子类前面,并且class 子类(父类名称): 必须在括号内指定父类名称

super()是一个特殊函数,让py将子类和父类关联起来,父类也叫做超类。

为电车类定义一个属于自己子类的方法

class ElectricCar(Car):
    def __init__(self, make, model, year):
        # 初始化父类的属性
        super().__init__(make, model, year)
        # 为电车电量赋予初始值
        self.battery_size = 70

    def desc_battery(self):
        print('电量还剩余: ' + str(self.battery_size))

重写父类方法

只要子类中定义一个与父类方法同名的方法,那么子类中的方法就把父类中的同名方法覆盖掉了。

将实例用作属性

随着代码编写,发现类文件越来越长,这时候可以将类的一部分作为一个独立的类提取出来。比如,上面那个电车类,针对电池,可以单独提出来做个类,然后在电车类中引用。

class Barrery():
    def __init__(self, battery_size=70):
        self.battery_size = battery_size

    def desc_battery(self):
        print('电量还剩余: ' + str(self.battery_size))


class ElectricCar(Car):
    def __init__(self, make, model, year):
        # 初始化父类的属性
        super().__init__(make, model, year)
        self.barrery = Barrery()


mytesla = ElectricCar('tesla', 'model s', 2016)
# 调用实例化类中的方法
mytesla.barrery.desc_battery()

导入类

PY允许将类存储在模块中,然后在主程序中导入所需的模块

导入单个类

创建一个car.py

class Car():
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        # 指定默认值
        self.odometer_reading = 0

    def get_desc_name(self):
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()
    
    def update_odometer(self, meter):
        self.odometer_reading = meter

    def increment_odometer(self, meter):
        self.odometer_reading += meter

然后再创建一个my_car.py,在其中导入Car类

from car import Car

mycar = Car('nissan', 'tiida', 2016)
print(mycar.get_desc_name())

mycar.odometer_reading = 55
print(mycar.odometer_reading)

在一个模块中存储多个类

class Car():
    def __init__(self, make, model, year):
        self.....
    
class Barrery():
    def __init__(self, battery_size=70):
        self....

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

在my_car.py中引用

from car import ElectricCar

mybyd = ElectricCar('byd', '秦', 2024)
print(mybyd.get_desc_name())

从一个模块中导入多个类

from car import Car, ElectricCar

mybyd = ElectricCar('byd', '秦', 2024)
print(mybyd.get_desc_name())

mynissan = Car('nissan', 'xtral', 2021)
print(mynissan.get_desc_name())

运行结果:

2024 Byd 秦
2021 Nissan Xtral

导入整个模块

还可以导入整个模块,然后使用句点法访问需要的类。

# 指的是car.py
import car

mybyd = car.ElectricCar('byd', '秦', 2024)
print(mybyd.get_desc_name())

mynissan = car.Car('nissan', 'xtral', 2021)
print(mynissan.get_desc_name())

导入模块中多有类

from module_name import *

from car import *

在一个模块中导入另一个模块

我们将电车类,与电池类单独放在一个模块中,electric_car.py

from car import Car

class Barrery():
    ...

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

这里如果不引入Car,那么就会报错。

在主程序my_car.py中

from car import Car
from electric_car import ElectricCar

mybyd = ElectricCar('byd', '秦', 2024)
print(mybyd.get_desc_name())

mynissan = Car('nissan', 'xtral', 2021)
print(mynissan.get_desc_name())

使用哪个类就单独引入哪个。

类的编码风格

类名采用驼峰命名法,不使用下划线,实例名和模块名都采用小写格式,用下划线分割。

类中使用一个空行分隔方法,模块中使用两个类分隔类。

import标准库与自己的类的时候,之间用空行分离。

import 标准库
#中间空行
from 自己的文件  import  自己的类

每个类、每个模块都应该添加文档字符串,描述类和模块的功能。

点赞 支持一下 觉得不错?客官您就稍微鼓励一下吧!
关键词:class,python
推荐阅读
  • uniapp实现被浏览器唤起的功能

    当用户打开h5链接时候,点击打开app若用户在已经安装过app的情况下直接打开app,若未安装过跳到应用市场下载安装这个功能在实现上主要分为两种场景,从普通浏览器唤醒以及从微信唤醒。

    10325次阅读 681人点赞 发布时间: 2022-12-14 16:34:53 立即查看
  • Vue

    盘点Vue2和Vue3的10种组件通信方式

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异;本文将通过选项式API组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式。

    4813次阅读 361人点赞 发布时间: 2022-08-19 09:40:16 立即查看
  • JS

    几个高级前端常用的API

    推荐4个前端开发中常用的高端API,分别是MutationObserver、IntersectionObserver、getComputedstyle、getBoundingClientRect、requ...

    14925次阅读 984人点赞 发布时间: 2021-11-11 09:39:54 立即查看
  • PHP

    【正则】一些常用的正则表达式总结

    在日常开发中,正则表达式是非常有用的,正则表达式在每个语言中都是可以使用的,他就跟JSON一样,是通用的。了解一些常用的正则表达式,能大大提高你的工作效率。

    14141次阅读 540人点赞 发布时间: 2021-10-09 15:58:58 立即查看
  • 【中文】免费可商用字体下载与考证

    65款免费、可商用、无任何限制中文字体打包下载,这些字体都是经过长期验证,经得住市场考验的,让您规避被无良厂商起诉的风险。

    12992次阅读 1051人点赞 发布时间: 2021-07-05 15:28:45 立即查看
  • Vue

    Vue3开发一个v-loading的自定义指令

    在vue3中实现一个自定义的指令,有助于我们简化开发,简化复用,通过一个指令的调用即可实现一些可高度复用的交互。

    17169次阅读 1378人点赞 发布时间: 2021-07-02 15:58:35 立即查看
  • JS

    关于手机上滚动穿透问题的解决

    当页面出现浮层的时候,滑动浮层的内容,正常情况下预期应该是浮层下边的内容不会滚动;然而事实并非如此。在PC上使用css即可解决,但是在手机端,情况就变的比较复杂,就需要禁止触摸事件才可以。

    15607次阅读 1265人点赞 发布时间: 2021-05-31 09:25:50 立即查看
  • Vue

    Vue+html2canvas截图空白的问题

    在使用vue做信网单页专题时,有海报生成的功能,这里推荐2个插件:一个是html2canvas,构造好DOM然后转canvas进行截图;另外使用vue-canvas-poster(这个截止到2021年3月...

    30927次阅读 2432人点赞 发布时间: 2021-03-02 09:04:51 立即查看
  • Vue

    vue-router4过度动画无效解决方案

    在初次使用vue3+vue-router4时候,先后遇到了过度动画transition进入和退出分别无效的情况,搜遍百度没没找到合适解决方法,包括vue-route4有一些API都进行了变化,以前的一些操...

    26767次阅读 2058人点赞 发布时间: 2021-02-23 13:37:20 立即查看
交流 收藏 目录