python-02

面向对象

Python中把具有相同属性和方法的对象归为一个类。

class ClassName:

        语句

class Myclass:   # 定义类Myclass
    def pp(self):  # 定义方法pp()
        print("这是产品说明书")

myclass = Myclass()  # 实例化类Myclass
myclass.pp()  # 调用Myclass中的方法pp()打印文本信息

类是对象的抽象,而对象是类的具体实例。

class SmplClass:
    def info(self):
        print('abc')
    def mycacl(self,x,y):
        return x+y

sc = SmplClass()
print('我的微信账号是:')
sc.info()
print('我的余额是:')
print(sc.mycacl(300,4),'元')

构造方法__init__()

class Complex:
    def __init__(self,XX,SX):
        self.r = XX
        self.i = SX
print('一碗米线的利润')
x = Complex(0.1,2.4)
print("在",x.r,'到',x.i,'之间')

构造方法用于类实例化时初始化相关数据,如果在这个方法中有相关参数,则实例化时就必须提供。

如果类中定义了__init__()方法,那么类的实例化操作会自动调用__init__()方法。

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

    def wang(self):
        print(self.name.title()+"旺旺")  # title()方法,首字母大写

    def shen(self):
        print(self.name.title()+"伸舌头")

my_dog = Dog("将军",6)
your_dog = Dog("锤石", 3)

print("我宠物的名字是" +my_dog.name.title()+'.')
print("我宠物已经"+str(my_dog.age)+"岁了")

print("你宠物的名字是" +your_dog.name.title()+'.')
print("你宠物已经"+str(your_dog.age)+"岁了")

私有方法和属性 

在python程序中声明的方法,默认都是共有的方法。

私有方法是指只能在声明它的类中调用,不能被外部调用。

想让某个方法为私有,只需将其名称以两个下划线开头即可。

class Site:
    def __init__(self,name,url):
        self.name = name   # 公共属性
        self.__url = url   # 私有属性

    def who(self):
        print('店名:', self.name)
        print('网址:',self.__url)

    def __foo(self):  # 定义私有方法
        print('客服旺旺:123XXXX')
    def foo(self):   # 定义公共方法
        print("联系地址:北京XXXX")
        self.__foo() # 在类中可以使用

x = Site('XXX天猫旗舰店', 'www.XXXX.com')

x.who()
x.foo()
# x.__foo()   # 报错

__del__()析构方法

class NewClass(object):
    num_count = 0
    def __init__(self, name):
        self.name = name
        NewClass.num_count += 1
        print(name, NewClass.num_count)

    def __del__(self):
        NewClass.num_count -=1
        print("Del",self.name, NewClass.num_count)

    def test(self):
        print("aa")

aa = NewClass("普通客户")
bb = NewClass("大客户")
cc = NewClass("集团客户")
del aa
del bb
del cc
print('Over')

当使用内置方法del()删除对象时,会调用它本身的析构函数。

另外,当一个对象在某个作用域中调用完毕后,在跳出其作用域时,析构函数也会被调用一次,这样可以使用析构方法__del__()释放内存空间。

实例方法、类方法、静态方法

class Jing:
    def __init__(self,x = 0):
        self.x = x

    @staticmethod
    def static_method():  # 定义静态类方法
        print("地铁即将进站")

    @classmethod
    def class_method(cls):  # 定义类方法,默认参数cls
        print("请大家注意安全")

Jing.static_method()  # 没有实例化类,通过类名调用类方法
dm = Jing()  # 实例化类
dm.static_method()   # 通过类实例调用静态方法
dm.class_method()  # 通过类实例调用类方法

实例方法:一般方法,其隐含调用的参数时类的实例。

类方法:隐含调用的参数是类。在定义类方法时,应使用装饰器@classmethod进行修饰,并且必须有默认参数“cls”。

静态方法:没有隐含调用的参数。在定义静态方法时,应该使用修饰符@staticmethod进行修饰,并且没有默认参数。

在调用静态方法和类方法时,可以直接由类名进行调用,在调用前无须实例化类。

也可以使用该类的任意一个实例进行调用。

属性

class Address:
    detail = "广州"
    post_code = '510660'
    def info(self):
        # print(detail)   # 尝试直接访问类变量,报错
        print(Address.detail)
        print(Address.post_code)

addr1 = Address()
addr1.info()
addr2 = Address()
addr2.info()
Address.detail = "佛山"
Address.post_code = '460110'
addr1.info()
addr2.info()

既可以在构造方法中定义属性,也可以在类中的其他方法中使用定义的属性。

类属性:是同一个类的所有实例所共有的,直接在类体中独立定义,引用格式为“类名.类变量名”,只要是某个实例对其进行了修改,就会影响这类所有其他的实例。

实例属性:同一个类的不同实例,其值是不相关联的,也不会互相影响,定义时格式为“self.属性名”,调用时也使用这个格式。

class Car():
    def __init__(self, manufacturer, model, year):
        self.manufacturer = manufacturer
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        long_name = str(self.year)+" "+self.manufacturer+" "+self.model
        return long_name.title()
    def read_odometer(self):
        print("目前仪表显示行驶里程是"+str(self.odometer_reading)+"公里!")

my_new_car = Car('Benz','E300L',2022)
print(my_new_car.get_descriptive_name())

my_new_car.odometer_reading = 12 # 修改属性
my_new_car.read_odometer()

修改属性:通过实例进行修改。通过自定义方法修改。

继承

class Car():   # 父类,必须包含在当前文件中,且位于子类前面
    def __init__(self,manufacturer, model, year):
        self.manufacturer = manufacturer
        self.model = model
        self.year = year

    def get_descriptive_name(self):
        long_name = str(self.year)+" "+self.manufacturer+" "+self.model
        return long_name

class Bmw(Car):  # 子类
    def __init__(self,manufacturer,model,year):
        super().__init__(manufacturer,model,year)  # 将父类和子类关联起来。可以让python调用父类Car的方法__init__(),可以让Bmw的实例包含父类Car中的所有属性。

my_tesla = Bmw("宝马","525Li","2022款")
print(my_tesla.get_descriptive_name())

类的继承是指新类从已有的类中取得已有的特性,诸如属性、变量和方法等。

类的派生是指从已有的类产生新类的过程,这个已有的类称为基类或者父类,而新类则称为派生类或者子类。

子类不但可以继承使用父类中的数据成员和成员函数,而且也可以增加新的成员。

class ClassName1(ClassName2):

        语句

ClassName1表示子类名,ClassName2表示父类名。

如果在父类中有一个方法名,而在子类使用时未指定,python会从左到右进行搜索。也就是说,当方法在子类中未找到时,将从左到右查找父类中是否包含该方法。

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

        self.odometer = year

    def get_discriptive_name(self):
        long_name = str(self.year)+" "+ str(self.manufacturer)+" "+self.model
        return long_name.title()

class Bmw(Car):
    def __init__(self,manufacturer,model,year):  
        super().__init__(manufacturer,model,year)

        self.Motor = Motor()   # 每当方法__init__()被调用时都会执行这个操作,所以每个Bmw实例中都包含一个自动创建的Motor实例。

class Motor(Bmw):
    def __init__(self,Motor_size=60):
        self.Motor_size = Motor_size

    def describe_motor(self):
        print("这款车的发动机参数是"+ str(self.Motor_size)+"24马力,3.0T涡轮增压,功率高达225KW。")

my_tesla = Bmw("宝马","535Li","XX款")
print(my_tesla.get_discriptive_name())
my_tesla.Motor.describe_motor()

class PrntOne:
    namea = "PrintOne"
    def set_value(self,a):
        self.a = a
    def set_namea(self,namea):
        PrntOne.namea =namea
    def info(self):
        print("PrntOne:%s,%s"%(PrntOne.namea,self.a))

class PrntSecond:
    nameb = 'PrntSecond'
    def set_nameb(self,nameb):
        PrntSecond.nameb = nameb
    def info(self):
        print('Prntsecond:%s'%(PrntSecond.nameb))

class Sub(PrntOne, PrntSecond):
    pass
class Sub2(PrntOne, PrntSecond):
    pass
class Sub3(PrntOne, PrntSecond):
    def info(self):
        PrntOne.info(self)
        PrntSecond.info(self)

print('使用第一个子类:')
sub = Sub()
sub.set_value('11111')

sub.info()
sub.set_nameb('22222')

sub.info()
print('使用第二个子类')
sub2 = Sub2()
sub2.set_value('33333')

sub2.info()
sub2.set_nameb('44444')

sub2.info()
print('使用第三个子类')
sub3=Sub3()
sub3.set_value('55555')

sub3.info()
sub3.set_nameb('66666')
sub3.info()

第一个子类Sub先后继承了PrntOne、PrntSecond,在实例化后,先调用PrntOne中的方法。因此在调用info()方法时,由于两个父类中有同名的方法info(),所以实际上调用了PrntOne()中的info()方法,因此只输出了从父类PrntOne中继承的相关信息。

第二个子类Sub2继承的顺序相反,当调用info()方法时,实际上调用的是属于PrntSecond中的info()方法,因此只输出从父类PrntSecond中继承的相关信息。

第三个子类Sub3继承的类及顺序和第一个子类Sub相同,但是修改了父类中info()方法,在其中分别调用了两个父类中的info()方法,因此,每次调用Sub3类实例的info()方法,两个被继承的父类中信息都会输出。

class Wai:
    def __init__(self,x=0,y=0,color='black'):
        self.x = x
        self.y = y
        self.color = color

    def haijun(self,x,y):
        self.x = x
        self.y = y
        print('发射鱼雷...')
        self.info()

    def info(self):
        print('定位目标:(%d,%d)' % (self.x,self.y))

    def gongji(self):
        print("导弹发射!")

class FlyWai(Wai):
    def gongji(self):
        print("拦截导弹")

    def fly(self,x,y):
        print("发射火箭...")
        self.x = x
        self.y = y
        self.info()

flyWai = FlyWai(color='red')
flyWai.haijun(100, 200)
flyWai.fly(12,15)
flyWai.gongji()

重载:当子类在使用父类中的方法时,如果发现父类中的方法不符合子类的需求,可以对父类中的方法进行重写。

模块和包

# module_test.py
print('《三体2.黑暗森林》上部 面壁者')
name = '这是小说的第一段'
def m_t_pr():
    print('序章')
# but.py
import module_test
module_test.m_t_pr()
print("褐蚁已经顽疾这里曾是他的家园。", module_test.name)

外部模块文件和调用文件在同一个目录中。

如果在当前目录没有找到要导入的模块,python解释器会从sys模块中的path变量指定的目录查找要导入的模块。

使用文件__init__.py创建一个包,然后创建多个python程序文件,实现包内成员函数的相互调用。

迭代器

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退。

每当使用其中的数据时,每次从数据流中取出一个数据,直到数据被取完为止,而且这些数据不会被重复使用。

方法iter():返回对象本身,是for语句使用迭代器的要求。

方法next():用于返回容器中下一个元素或数据,当使用完容器中的数据时会引发StopIteration异常。

class Use:
    def __init__(self,x=2,max=50):
        self.__mul,self.__x = x,x
        self.__max = max
    def __iter__(self):  # 定义迭代器协议方法
        return self    # 返回类自身
    def __next__(self):  # 定义迭代器协议方法
        if self.__x and self.__x != 1:
            self.__mul *= self.__x
            if self.__mul <= self.__max:
                return self.__mul
            else:
                raise StopIteration
        else:
            raise StopIteration
if __name__=='__main__':
    my = Use()
    for i in my:
        print('新专辑签售会的幸运者有:',i,'号')

定义迭代器类Use,在其构造方法中,初始化私有实例属性,功能是生成序列并设置序列中的最大值。这个迭代器总是返回所给整数的n次方,当其最大值超过参数max值时就会引发StopIteration异常。

from random import randint
def guess():
    return randint(0,10)

num = 1
for i in iter(guess, 5):
    print("第%s次猜测,猜测数字为:%s"%(num, i))
    num += 1

iter(iterable):要求参数为可迭代类型,也可以使用各种序列类型。

iter(callable, sentinel):callable表示可调用类型,一般为函数;sentinel是一个标记,当第一个参数(函数)调用返回值等于第二个参数的值时,迭代或遍历会马上停止。

生成器

使用关键字yield定义的函数称为生成器。

通过生成器,可以生成一个值的序列用于迭代,并且这个值的序列不是一次生成的,而是使用一个,再生成一个。

def fib(max):
    a,b = 1,1
    while a< max:
        yield a  # 当程序运行到yield这行时就不会继续往下执行
        a,b = b, a+b

print("某代表队金牌榜的变化")
for n in fib(15):
    print(n)

当向生成器索要一个数时,生成器就会执行,直至出现yield语句时,生成器把yield的参数传出,之后生成器就不会往下继续运行。

当向生成器索要下一个数时,它会从上次的状态开始运行,直至出现yield语句时把参数传出,然后停下。

def shengYield(n):
    while n>0:
        print("电梯开始运行...:")
        yield n
        print("刚刚降落了一层!")
        n -= 1

if __name__=="__main__":
    for i in shengYield(4):
        print("现在是",i,"楼")
    print()
    sheng_yield = shengYield(3)
    print('已经实例化生成器对象')
    sheng_yield.__next__()  # 直接遍历自己创建的生成器
    print('第二次调用__next__()方法:')

 生成器中包含yield语句时,不但可以用for直接遍历,而且也可以使用手工方式调用其方法__next__()进行遍历。

装饰器

@run_time

def han_fun():

        pass

 装饰器本质是一个python函数,它可以让其他函数在不需要任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数。

简单地讲,装饰器的作用就是为已经存在的对象添加额外的功能。

def deco(func):  # 定义装饰器函数deco()
    def _deco(a,b):
        print("在函数myfunc()之前被调用")
        ret = func(a,b)
        print("在函数myfunc()之后被调用,结果是:%s"%ret)
    return _deco

@deco
def myfunc(a,b):
    print("函数myfunc(%s,%s)被调用!"%(a,b))
    return a+b

myfunc(1, 2)

myfunc(3, 4)

def zz(muclass):    # 定义一个能够装饰类的装饰器zz
    class InnerClass:   # 定义一个内嵌类InnerClass来代替被装饰的类
        def __init__(self,z=0):
            self.z = 0
            self.wrapper = muclass() # 实例化被装饰的类
        def position(self):
            self.wrapper.position()
            print('z轴坐标:',self.z)
    return InnerClass   # 返回新定义的类

@zz
class coordination:
    def __init__(self,x = 0,y=0):
        self.x = x
        self.y = y
    def position(self):
        print("x轴坐标:",self.x)
        print("y轴坐标:",self.y)

if __name__=="__main__":
    print('下面是酒店x的3D坐标:')
    coor = coordination()
    coor.position()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/712608.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑缺失d3dcompiler_47.dll会怎么样,该如何修复呢

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“缺少d3dcompiler47.dll文件”。那么&#xff0c;d3dcompiler47.dll到底是什么&#xff1f;为什么计算机会缺失它&#xff1f;它会对电脑产生什么具体影响&#xff1f;如何解决这个问题&…

⭐Unity 控制任意UI的渐隐渐显

使用脚本之前先给要控制的UI加上CanvasGroup组件 解释: 这个脚本使用协程来逐渐改变CanvasGroup的alpha值&#xff0c;从而实现渐隐和渐显的效果。 Mathf.Lerp函数用于在指定的时间内平滑地从当前透明度过渡到目标透明度。 通过调用FadeIn和FadeOut方法&#xff0c;你可以在任…

SpringBoot 实现 阿里云语音通知(SingleCallByTts)

目录 一、准备工作1.开通 阿里云语音服务2.申请企业资质3.创建语音通知模板&#xff0c;审核通过4.调用API接口---SingleCallByTts5.调试API接口---SingleCallByTts 二、代码实现1.导入依赖 com.aliyun:aliyun-java-sdk-dyvmsapi:3.0.22.创建工具类&#xff0c;用于发送语音通知…

C++面向对象程序设计 - 函数库

C语言程序中各种功能基本上都是由函数来实现的&#xff0c;在C语言的发展过程中建立了功能丰富的函数库&#xff0c;C从C语言继承了些函数功能。如果要用函数库中的函数&#xff0c;就必须在程序文件中包含文件中有关的头文件&#xff0c;在不同的头文件中&#xff0c;包含了不…

RabbitMQ实践——交换器(Exchange)绑定交换器

在《RabbitMQ实践——交换器&#xff08;Exchange&#xff09;和绑定&#xff08;Banding&#xff09;》一文中&#xff0c;我们实验了各种交换器。我们可以把交换器看成消息发布的入口&#xff0c;而消息路由规则则是由“绑定关系”&#xff08;Banding&#xff09;来定义&…

GitLab教程(二):快速上手Git

文章目录 1.将远端代码克隆到本地2.修改本地代码并提交到远程仓库3.Git命令总结git clonegit statusgit addgit commitgit pushgit log 首先&#xff0c;我在Gitlab上创建了一个远程仓库&#xff0c;用于演示使用Gitlab进行版本管理的完整流程&#xff1a; 1.将远端代码克隆到本…

快速构建本地RAG聊天机器人:使用LangFlow和Ollama实现无代码开发

基于LangChain的快速RAG应用原型制作方法 还记得构建智能聊天机器人需要数月编码的日子吗&#xff1f; LangChain这样的框架确实简化了开发流程&#xff0c;但对非程序员来说&#xff0c;数百行代码仍然是一道门槛。 有没有更简单的方法呢&#xff1f; 图片由 Ravi Palwe 在…

数字政协:迈向智慧时代,开启政协工作新篇章

在信息化浪潮席卷全球的今天&#xff0c;数字技术不仅改变了我们的生活方式&#xff0c;也深刻影响着政治生态的变革。其中&#xff0c;“数字政协”的崛起&#xff0c;正是新时代政协工作创新发展的重要标志。那么&#xff0c;什么是数字政协&#xff1f;它又将如何助力政协工…

[图解]建模相关的基础知识-09

1 00:00:01,350 --> 00:00:03,780 首先&#xff0c;我们来看一下什么叫关系 2 00:00:05,370 --> 00:00:08,990 这个关系跟下面说的这些关系 3 00:00:09,000 --> 00:00:10,390 它不是一个东西 4 00:00:11,110 --> 00:00:14,950 比如说&#xff0c;我们UML类图上&…

门控循环单元GRU与长短期记忆网络LSTM

门控循环单元与长短期记忆网络 门控隐状态 问题提出&#xff1a;对于一个序列来说不是每个观察值都是同等重要想只记住相关的观察需要&#xff1a; 能关注的机制&#xff08;更新门&#xff09;能遗忘的机制&#xff08;重置门&#xff09; 第一个词元的影响至关重要。 我们…

使用vuejs3时,报错:Uncaught (in promise)

解决&#xff1a; vite.config.js里 import {fileURLToPath, URL} from node:urlimport {defineConfig} from vite import vue from vitejs/plugin-vue// https://vitejs.dev/config/ export default defineConfig({resolve: {alias: {: fileURLToPath(new URL(./src, import…

LeetCode | 520.检测大写字母

这道题直接分3种情况讨论&#xff1a;1、全部都为大写&#xff1b;2、全部都为小写&#xff1b;3、首字母大写其余小写。这里我借用了一个全是大写字母的串和一个全为小写字母的串进行比较 class Solution(object):def detectCapitalUse(self, word):""":type …

通过Vue3+高德地图的JS API实现市区地图渲染

效果图: 核心代码: <script setup>import { onMounted, onUnmounted } from vue;import AMapLoader from @amap/amap-jsapi-loader;import { message } from ant-design-vue;import school from @/assets/icons/school.svg;import enterprise from @/assets/icons/ent…

pytest + yaml 框架 -61.jenkins+allure+钉钉通知添加测试结果

前言 上一篇pytest + yaml 框架 -60.git+jenkins+allure+钉钉通知反馈 已经实现测试结果用钉钉通知。 本篇继续在钉钉通知里添加测试的汇总结果,此功能在pytest-yaml-yoyo v1.5.2版本上实现。 Environment Injector 插件 在运行完用例后会生成一个summary.json 文件,汇总…

JAVA小知识20:万字详解List与ArrayList

一、集合简介 1.1、什么是集合&#xff1f; 可同时存储多个元素的数据结构就是集合。 1.2、为什么要有集合&#xff1f; 我们可以使用数组同时存储多个元素&#xff0c;但是数组有个弊端。数组创建之后长度就会固定&#xff0c;如需扩容则需要手动扩容&#xff0c;我们需要…

【计算机视觉】人脸算法之图像处理基础知识(四)

图像的几何变换 图像的几何变换是指在不改变图像内容的前提下对图像的像素进行空间几何变换。主要包括图像的平移变换、镜像变换、缩放和旋转等。 1.插值算法 插值通常用来放缩图像大小&#xff0c;在图像处理中常见的插值算法有最邻近插值法、双线性插值法、二次立方、三次…

中小制造业工厂要不要上MES系统

MES系统的主要功能包括制造数据管理、计划排产管理、生产调度管理、库存管理、质量管理、人力资源管理、工作中心/设备管理、工具工装管理、采购管理、成本管理、项目看板管理、生产过程控制、底层数据集成分析、上层数据集成分解等。通过这些模块&#xff0c;MES为企业打造一个…

【网络安全学习】使用Kali做渗透情报收集-01-<域名信息主机信息>

1.收集开源情报 开源情报(Open Source Intelligence&#xff0c;OSINT)是指从各种公开的渠道中寻找和获取有价值的信息 如&#xff1a;互联网、媒体、社交网络、公共数据库等开源情报具有以下特点&#xff1a; - 丰富性&#xff1a;开源情报涵盖了各种类型和领域的信息 - 可…

【学习】什么样的软件测试项目适合做自动化测试

随着科技的发展和社会的进步, 软件行业也在不断地壮大和发展。在这个过程中&#xff0c;软件测试变得越来越重要&#xff0c;并且成为了保证软件质量的关键环节。而自动化测试作为软件测试的一种方法&#xff0c;在提高测试效率、降低人力成本等方面具有显著的优势。那么什么样…

SpringBoot集成mqtt上下线提醒功能设计

目录 1.首先安装emqx&#xff0c;去官网下载emqx压缩包&#xff0c;并且解压。 2.使用emqx start 命令启动emqx后台管理 3.下载mqttx调试工具&#xff0c;使用mqttx调试mqtt连接。下载地址:MQTTX下载-MQTTX官方版下载,下载完成直接打开&#xff0c;便可进行mqtt连接调试 4.…