py第八章 面向对象 笔记

news2024/11/18 6:37:46

8.1类与对象的基础运用

类是抽象的,对象是类的实例

8.1.1类的定义

class 类名:
    属性名=属性值
    def 方法名(self):
        方法体

类名:

大驼峰命名法:首字母一般为大写

方法参数列表中的第一个参数是一个指代对象的默认参数self

class Car:
    wheels=4
    def drive(self):
        print('行驶')

8.1.2对象的创建与使用

对象名=类名()
car=Car()

访问属性或调用方法的语法格式:

对象名.属性名
对象名.方法名()
print(car.wheels)
car.deive()

8.2类的成员

8.2.1 属性

属性根据声明方式有两类:类属性和实例属性。

    • 类属性

类属性是声明在类內部、方法外部的属性。

例如上边的wheels。类属性可以通过类或对象进行访问,但是只能通过类进行修改。

    • 实例属性

实例属性是在方法内部声明的属性,py支持动态添加实例属性。

(1)访问实例属性

实例属性只能通过对象访问。

对象名.属性名

(2)修改实例属性

对象名.属性名=修改后的值

(3)添加实例属性

对象名.属性名=添加的属性值

属性名好像可以重复

8.2.2方法

py中的方法有三种:

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

    • 实例方法

实例方法定义在类內部,以self为第一个形参。实例方法中的self代表对象本身,他会在实例方法被调用的时候自动接收由系统传递的调用该方法的对象。

实例方法只能通过对象调用。

def drive(self):
    print('我是实例方法')

2.类方法

类方法定义在类内部:

@classmethod 
def 类方法名(cls):
    方法体

类方法列表参数中的第一个参数是cls 代表类本身,他会在类方法被调用的时候自动接收由系统传递的调用该方法得类。

类方法可以由类和对象调用。

类方法可以修改属性

class Car:
    whells=6
    @classmethod
    def stop(cls):
        print('我是类方法')
        cls.whells=7
car=Car()
print(car.whells)
print(Car.whells)
car.stop()   
print(car.whells)
print(Car.whells)

3.静态方法

静态方法定义在类內部

@staticmethod
def 静态方法名():
    方法体

静态方法可以通过类和对象调用。

静态方法内部不能直接访问属性或方法,但可以通过类名访问属性,或调用类方法。

class Car:
    whells=6
    @staticmethod
    def test():
        print('我是静态方法')
        print(f'类属性的值是{Car.whells}')
car=Car()
car.test() 

8.2.3私有成员

py默认成员是共有的。就是可以通过类或对象随意访问。

当属性名或方法名前边加“__”双下划线就代表当前的成员是私有的。

__属性名
__方法名

私有成员在类的外部不能直接访问,但是可以调用类的公共方法访问。

class Car:
    __wheels=6
    def _drive(self):
        print('行驶')
    def test(self):
        print(f"轿车有{self.__wheels}轮胎")
        self._drive()
car=Car()
print(car.test())

8.3特殊方法

8.3.1构造方法

在创建的时候负责对象的初始化。每个类默认有一个__init__()方法,如果显式的定义了__init__()方法那么创建对象的时候调用显式的构造方法,否则调用默认的。

构造方法分两种:

有参构造方法和无参构造方法。

当使用无参构造方法的时候,所有对象的值都有相同的初始值。

当使用有参构造方法时,所有对象的属性可以是不通的初值。

class Car:
    def __init__(self):
        self.color='红色'
    def drive(self):
        print(f"车的颜色是:{self.color}")
car_one=Car()
car_one.drive()
car_tow=Car()
car_tow.drive()

class Car:
    def __init__(self,color):
        self.color=color
    def drive(self):
        print(f"车的颜色是:{self.color}")
car_one=Car("红色")
car_one.drive()
car_tow=Car("蓝色")
car_tow.drive()

突然感觉这里的self和Java中的this差不多,都表示本类。

构造方法每次创建对象都会被加载,我是理解成构造对象时用的方法。

class Car:
    def __init__(self,color):
        self.color=color
        print('构造方法被加载')
    def drive(self):
        print(f"车的颜色是:{self.color}")
car_one=Car("红色")
car_one.drive()
car_tow=Car("蓝色")
car_tow.drive()

8.3.2 析构方法

__del__()放法

是销毁对象时系统自动调用的特殊方法。每个类都有一个__del__()方法。如果一个类显式定义了析构方法,销毁对象的时候会调用显式的,如果没有显式定义,就会调用默认的。

class Car:
    def __init__(self) -> None:
        self.color='蓝色'
        print('对象被创建')
    def __del__(self):
        print('对象被销毁')
car =Car()
print(car.color)
del car
print(car.color)

py会通过引用计数器销毁对象,当引用计数器为0时系统会销毁对象。

8.4封装

封装是面向对象的重要特性之一,它的基本思想是对外隐藏类的细节,提供用于访问类成员的公开接口。

类的外部无须知道实现细节,只需要使用公开接口便可以访问类的内容,故在一定程度上保证了类内数据的安全。

为契合封装思想,在定义类的时候需要满足2点要求:

  1. 将属性声明为私有属性

  1. 添加两个供外界调用的公有方法,分别用于设置或获取私有属性的值。

class Person:
    def __init__(self,name) -> None:
        self.name=name
        self._age=1
        #设置私有属性的方法
    def set_age(self,new_age):
        if 0<new_age<=120:
            self._age=new_age
        #获取私有属性的值
    def get_age(self):
        return self._age
    

person=Person('小明')
print(f'年龄为{person.get_age()}岁')
person.set_age(66)
print(f'年龄为{person.get_age()}岁')

8.5继承

8.5.1单继承

一个子类只能继承一个父类

class 子类名 (父类名)

和java一样,子类继承会自动拥有父类的公有成员,若在定义的时候不指明该类的父类,那么就会默认继承基类object

#继承
# 单继承
class Cat(object):  #object写不写没啥意义
    def __init__(self,corlor) -> None:
        self.corlor=corlor
    def walk(self):
        print('走猫步~~~')
#定义继承Cat类的子类scottishFold
class ScottishFold(Cat):   #创建一个类
    pass
fold =ScottishFold("灰色")   #创建一个对象
print(f"{fold.corlor}的折耳猫")
fold.walk()

和java一样父类的私有属性和方法 子类是不能访问的。

class Cat(object):  #object写不写没啥意义
    def __init__(self,corlor) -> None:
        self._corlor=corlor
    def _walk(self):
        print('走猫步~~~')
#定义继承Cat类的子类scottishFold
class ScottishFold(Cat):   #创建一个类
    pass
fold =ScottishFold("灰色")   #创建一个对象
print(f"{fold.corlor}的折耳猫")
fold.walk()

8.5.2多继承

class 子类名(父类名1,父类名2···)

#多继承
#定义一个表示房子的类House
class House:
    def live(self):
        print('供人类居住')
#定义一个汽车类
class Car:
    def drive(self):
        print('方便人类出行')
#定义一个表示房车的类,继承House和Car
class TouringCar(House,Car):
    pass
tour_car=TouringCar()
tour_car.live()
tour_car.drive()

如果两个父类都有相同的方法,那么会调用先继承的类中的方法。

8.5.3重写

子类有时候感觉父类的方法不太合适,就可以更改,方法和java相似,只需要写一个名字相同的就好了,这样调用的时候就调用子类重写的方法了。如果重写后又想调用之前的方法了,就可以用

super().方法名()

py中好像不能有方法的多态,就是名字相同形参不同那种。py中这样写好像就是会只认识后边的方法。

?????????????????????????????????????????????

子类访问父类的方法就是可以用super().方法名。

然会就是

class Person():
    def say(self):
        print('666')
class Person2(Person):
     def say(self):
        print(999)
     def say(self):
        super().say()
     
p=Person2()
p.say()

如果我同时继承了多个父类,父类中有同名方法,我想调用某个父类的同名方法怎么办呢?

去博客了解了下发现有两种方法。

  1. 类名.方法名

  1. super(类前边的类,self).方法名

class   C1:
    def test(self):
        print('=========c1=======')
class C2:
    def test(self):
        print('=========c2=======')

class C3:
    def test(self):
        print('=========c3=======')
class C4(C1,C2,C3):
    def test(self):
        print('=========c4=======')
ctest=C4()
ctest.test()
class   C1:
    def test(self):
        print('=========c1=======')
class C2:
    def test(self):
        print('=========c2=======')

class C3:
    def test(self):
        print('=========c3=======')
class C4(C1,C2,C3):
    def test(self):
        C1.test(self)
        C2.test(self)
        C3.test(self)
        

        print('=========c4=======')
ctest=C4()
ctest.test()

class   C1:
    def test(self):
        print('=========c1=======')
class C2:
    def test(self):
        print('=========c2=======')

class C3:
    def test(self):
        print('=========c3=======')
class C4(C1,C2,C3):
    def test(self):
        super(C4,self).test()
        super(C1,self).test()
        super(C2,self).test()
        

        print('=========c4=======')
ctest=C4()
ctest.test()

8.6多态

#多态
class Cat:
    def shout(self):
        print('喵喵喵')
class Dog:
    def shout(self):
        print('汪汪汪')
def shout(obj):
    obj.shout()

cat=Cat()
dog=Dog()
shout(cat)
shout(dog)

重点是第八行,其实是定义了一个方法,书上说接口,这个接口会接收一个对象,然后调用对象的某个方法。

8.7运算符重载

py中赋予了运算符的特殊方法,我们可以根据重写运算符的方法来达到便捷的目的。

举例:

class Calculator:
    def __init__(self,number) -> None:
        self.number=number
    def __add__(self,other):
        self.number=self.number+other
        return self.number
    def __sub__(self,other):
        self.number=self.number-other
        return self.number
    def __mul__(self,other):
        self.number=self.number*other
        return self.number
    def __truediv__(self,other):
        self.number=self.number/other
        return self.number


claculator=Calculator(10)
print(claculator+5)
print(claculator-5)
print(claculator*5)
print(claculator/5)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

非常好用,绝对未来黑马的 Python 开源测试框架 PySimpleTest

非常好用&#xff0c;绝对未来黑马的 Python 开源测试框架 PySimpleTest 简单介绍 PySimpleTest 是一个非常简洁开源的python代码测试框架&#xff0c;作者是 https://github.com/Time-Coder?tabstars 你可以在以下网站找到PyPI索引&#xff1a;https://pypi.org/project/P…

CSS 排行榜

CSS 排行榜 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>排行榜</title><style type"text/css">* {margin: 0;padding: 0;}/* 容器 */.rank-container {width: 400px;color: #333;font-size: 14p…

go 常用命令

巩固学习最好的方法是通过go help看文档 GO语言规范文档 终端执行命令 go help environment GOBIN The directory where ‘go install’ will install a command. go 命令使用 go <command> [arguments]command&#xff1a; The commands are:bug start a b…

十、MySQL 聚合函数、分组查询及过滤分组

文章目录一、聚合函数1.1 COUNT()函数1.2 SUM()函数1.3 AVG()函数1.4 MAX()函数1.5 MIN()函数二、分组查询及过滤分组2.1 创建分组2.2 使用HAVING过滤分组2.3 WHERE和HAVING的对比前置知识&#xff1a; 一、数据库开发与实战专栏导学及数据库基础概念入门 二、MySQL 介绍及 MyS…

你知道这些快捷键吗?

今天就给大家带来常用的电脑快捷键&#xff0c;让你的办公和学习效率加倍&#xff0c;一起来看看吧&#xff01; 快捷键一&#xff1a;快速切换窗口 想要快速切换电脑正在使用的窗口程序&#xff0c;就可以使用“AltTab”键即可快速切换。先按住“Alt”按键&#xff0c;再按“T…

GO语言的实战学习(猜谜游戏和在线词典)| 青训营笔记

一.GO语言的实战学习 1.1 前言 在上文我们急速学习了Go语言的入门&#xff0c;今天我们来学习一下Go语言的实战 本专栏代码&#xff0c;源码打包下载地址如下&#xff1a; https://download.csdn.net/download/weixin_52908342/87389481 二.猜谜游戏 1.导入依赖包&#xff…

模拟实现一个简单的命令行解释器(shell)

目录 前言 环境变量与本地变量 和环境变量相关的命令 获取环境变量的三种方法 第一种 第二种 第三种 进程地址空间 页表 为什么存在进程地址空间 第一 第二 第三 进程控制 进程的产生 进程终止 进程等待 进程替换 模拟实现一个shell 前言 我们通过各种指令来实现…

脚手架2 以nacos为注册中心,基于Gateway构架网关

在前一步上已经说明&#xff0c;组件脚手架的第一步就是构建注册中心&#xff0c;由于采用nacos&#xff0c;这些将直接放在配置文件中实现&#xff0c;不再单独搭建eureka。 spring nacos jdk各组件依赖版本推荐 Spring Boot&#xff0c;Spring Cloud&#xff0c;Spring Clo…

HTC Cosmos手柄的坑

HTC Cosmos手柄的坑Unreal蓝图通过手柄射线操作UI用浏览器插件进行游戏界面设计Cosmos手柄遇到的问题Unreal蓝图通过手柄射线操作UI Unreal蓝图通过手柄射线操作UI很简单&#xff0c;虚幻提供一个WidgetInteraction的组件&#xff0c;可以模拟键盘和鼠标操作。 Enable Hit Te…

【最优潮流】二阶锥松弛在配电网最优潮流计算中的应用(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

组件化 – 额外知识补充

1、组件的生命周期 1.1、认识生命周期 什么是生命周期呢&#xff1f; 生物学上&#xff0c;生物生命周期指得是一个生物体在生命开始到结束周而复始所历经的一系列变化过程&#xff1b;每个组件都可能会经历从创建、挂载、更新、卸载等一系列的过程&#xff1b;在这个过程中…

升级 Node 版本教程

【node】升级 Node 版本教程 文章目录 Window 系统Mac 或 Linux系统 Window 系统 window系统升级node只能到node官网下载window安装包来覆盖之前的node。node 安装教程附下载地址&#xff1a;https://blog.csdn.net/qq_45677671/article/details/114535955因为 n 模块是不支…

transformers学习笔记3

创建model的方法automodel创建预训练模型使用automodel直接创建&#xff0c;使用的是hug face官网上的预训练好的模型参数&#xff0c;完成创建后再使用自己本地的数据集进行迁移训练automodel api 去官网上下载用户指定类型模型的config file 和model file&#xff0c;config说…

【Rvnc】基于noVnc集成的远程终端管理平台

新年好&#xff01;祝各位小伙伴们新年快乐&#xff01;工资翻倍&#xff01; 项目介绍 项目地址&#xff1a;https://github.com/LogestCai/Rvnc 基于noVNC、C#和easyAdmin快速开发的远程管理平台。 可快速部署企业内部远程管理平台&#xff0c;方便企业运维管理。 安装教程…

I.MX6ULL裸机开发笔记6:GPIO控制原理

目录 一、了解GPIO 二、时钟 三、引脚复用 四、引脚属性 五、控制GPIO总结 六、硬件原理图 一、了解GPIO 数量 5组GPIO&#xff08;GPIO1~GPIO5&#xff09;,每组最多32个&#xff0c;共124个 GPIO1_IO0——GPIO1_IO31GPIO2_IO0——GPIO2_IO21GPIO3_IO0——GPIO3_IO2…

#C. wll 的糖果分配

说明过年啦&#xff01;wll 带着好多好多的糖果回到家里&#xff0c;打算分给弟弟妹妹们她一共带回了 66 种不同的糖果&#xff0c;第 ii 种糖果的美味度为 ii&#xff0c;共有 a_iai 颗但是弟弟们和妹妹们不想在一起玩&#xff0c;他们想分别拿走糖果&#xff0c;各自玩耍那么…

物联网到底是什么,生活中能用得上吗?

物联网在近些年以来一直都是热点&#xff0c;人人都在提物联网。但物联网到底是什么&#xff1f;究竟能做什么&#xff1f;说起物联网&#xff0c;你是不是感到既熟悉又陌生&#xff1f;没错&#xff0c;从随处可见的射频技术&#xff0c;智能穿戴&#xff0c;智能电器&#xf…

Android 系统 Framework 中定制实现开关机动画实践

文章目录写在前面需求背景主要问题接口测试权限问题对比测试最后实现方案其他问题总结写在前面 本文主要记录了在Android 10 系统 定制开关机动画时遇到的权限&#xff08;读写&#xff09;问题以用开关机动画资源的流程、文件要求等问题。 涉及知识点&#xff1a; Linux中文件…

【iOS】—— 工厂设计模式

工厂设计模式 文章目录工厂设计模式设计模式概念设计模式七大准则开闭原则单⼀职责原则里氏替换原则依赖倒转原则接口隔离原则迪米特法则合成复用原则类族模式简单工厂模式优点缺点主要作用示例文件分类实现效果&#xff1a;工厂方法模式优点缺点主要作用&#xff1a;示例&…

Ceres 目标函数(pose_graph_3d使用之)构建学习笔记

问题说明 ceres-solver库是google的非线性优化库&#xff0c;可以对slam问题&#xff0c;机器人位姿进行优化&#xff0c;使其建图的效果得到改善。pose_graph_3d是官方给出的二维平面上机器人位姿优化问题&#xff0c;需要读取一个g2o文件&#xff0c;运行程序后返回一个pose…