Python入门-面向对象

1.类和对象

在这里插入图片描述
是不是很熟悉?和Java一样,在Python中,都可以把万物看成(封装成)对象。它俩都是面向对象编程

1.1 查看对象数据类型

a = 10
b = 9.8
c = 'hello'

print(type(a))
print(type(b))
print(type(c))

运行结果:

D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap9\示例9-1查看对象的数据类型.py 
<class 'int'>
<class 'float'>
<class 'str'>

1.2 自定义数据类型

# 编写一个 Person
class Person():
    pass


# 编写一个 Cat 类
class Cat():
    pass


# 编写一个 Dog 类
class Dog:
    pass


class Student:
    pass

1.3 创建自定义类型的对象

# 编写一个 Person
class Person():
    pass


# 编写一个 Cat 类
class Cat():
    pass


# 编写一个 Dog 类
class Dog:
    pass


class Student:
    pass


#创建类的对象
# 对象名=类名()

# 创建一个 Person 类型的对象
per=Person()
c=Cat()
d=Dog()
stu=Student()

print(type(per))
print(type(c))
print(type(d))
print(type(stu))

运行结果:

D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap9\示例9-3创建自定义类型的对象.py 
<class '__main__.Person'>
<class '__main__.Cat'>
<class '__main__.Dog'>
<class '__main__.Student'>

1.4 类属性和实例属性的定义

class Student:
    # 类属性: 定义在类中,方法外的变量
    school = '北京大学'

    # 初始方法方法
    def __int__(self, xm, age):  # xm,age 是方法的参数,是局部变量,作用域 是 整个 __init__方法
        self.name = xm  # 左侧是实例属性, xm是局部变量,将局部变量的值 xm 赋值给实例属性 self.name
        self.age = age  # 实例的名称和局部变量的名称可以相同

1.5 类的组成

class Student:
    # 类属性: 定义在类中,方法外的变量
    school = '北京大学'

    # 初始方法方法
    def __init__(self, xm, age):  # xm,age 是方法的参数,是局部变量,作用域 是 整个 __init__方法
        self.name = xm  # 左侧是实例属性, xm是局部变量,将局部变量的值 xm 赋值给实例属性 self.name
        self.age = age  # 实例的名称和局部变量的名称可以相同

    # 定义在类中的函数,成为方法,自带一个 参数 self
    def show(self):
        print(f'我叫:{self.name},今年{self.age}岁了')

    # 静态方法
    @staticmethod
    def sm():
        # print(self.name)
        # self.show()
        print('这是一个静态方法,不能调用实例属性,也不能调用实例方法')

    # 类方法
    @classmethod
    def cm(cls):  # cls--> class 的简写
        print('这是一个类方法,不能调用实例属性,也不能调用实例方法')


# 创建类的对象
stu = Student('Jarvis', 21)   # 为什么传了两个参数?因为 __init__ 方法中,有两个形参, self 是自带的参数,无需手动传入

# 实例属性,使用对象名 进行打点调用
print(stu.name,stu.age)

#类属性,直接使用 类名,打点调用
print(Student.school)

#示例方法,使用对象名 打点调用
stu.show()

# 类方法 @classmethod 进行修饰的方法,直接使用类名打点调用
Student.cm()

# 静态方法 ,直接使用 类名打点调用
Student.sm()

1.6 编写学生类创建4个学生对象

class Student:
    # 类属性: 定义在类中,方法外的变量
    school = '北京大学'

    # 初始方法方法
    def __init__(self, xm, age):  # xm,age 是方法的参数,是局部变量,作用域 是 整个 __init__方法
        self.name = xm  # 左侧是实例属性, xm是局部变量,将局部变量的值 xm 赋值给实例属性 self.name
        self.age = age  # 实例的名称和局部变量的名称可以相同

    # 定义在类中的函数,成为方法,自带一个 参数 self
    def show(self):
        print(f'我叫:{self.name},今年{self.age}岁了')


# 根据 "图纸" 可以创建出 N多个对象
stu = Student('jarvis', 18)
stu2 = Student('zhangsan', 19)
stu3 = Student('lisi', 20)
stu4 = Student('wangwu', 21)

print(type(stu))
print(type(stu2))
print(type(stu3))
print(type(stu4))

Student.school = '清华大学'  # 给类的属性赋值

# 将学生对象存储到列表中
lst = [stu, stu2, stu3, stu4]  # 列表中的元素是 Student类型的对象
for item in lst:
    item.show()   # 对象打点调用实例方法


运行结果:

D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap9\示例9-6编写学生类创建4个学生对象.py 
<class '__main__.Student'>
<class '__main__.Student'>
<class '__main__.Student'>
<class '__main__.Student'>
我叫:jarvis,今年18岁了
我叫:zhangsan,今年19岁了
我叫:lisi,今年20岁了
我叫:wangwu,今年21岁了

1.7 动态绑定属性和方法

在这里插入图片描述
代码:

class Student:
    # 类属性: 定义在类中,方法外的变量
    school = '北京大学'

    # 初始方法方法
    def __init__(self, xm, age):  # xm,age 是方法的参数,是局部变量,作用域 是 整个 __init__方法
        self.name = xm  # 左侧是实例属性, xm是局部变量,将局部变量的值 xm 赋值给实例属性 self.name
        self.age = age  # 实例的名称和局部变量的名称可以相同

    # 定义在类中的函数,成为方法,自带一个 参数 self
    def show(self):
        print(f'我叫:{self.name},今年{self.age}岁了')


# 创建两个 Student 类型的对象
stu = Student('jarvis', 18)
stu2 = Student('zhangsan', 19)

print(stu.name,stu.age)
print(stu2.name,stu2.age)

# 为 stu2 动态绑定一个实例属性
stu2.gender='男'
print(stu2.name,stu2.age,stu2.gender)


#动态绑定 方法
def introduce():
    print('我是一个普通的函数,我被动态绑定成了 stu2对象的方法')

stu2.fun=introduce()  #函数的一个赋值,(记住方法千万不能加小括号,加小括号就是调用了)
# fun就是stu2对象的方法

#调用
stu2.fun

运行结果:

D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap9\示例9-7动态绑定属性和方法.py 
jarvis 18
zhangsan 19
zhangsan 19 男
我是一个普通的函数,我被动态绑定成了 stu2对象的方法

2.面向对象三大特征

封装,继承,多态

是的,和Java一样

在这里插入图片描述

2.1 封装-权限控制

在这里插入图片描述
代码:

class Student():
    #首位双下划线
    def __init__(self,name,age,gender):
        self._name=name   # self._name 受保护的,只能本类和子类访问
        self.__age=age    # self.__age 表示私有的,只能类本身去访问
        self.gender=gender #普通的实例属性,类的内部,外部,及子类都可以访问


    def _fun1(self):
        print('子类及本身可以访问')

    def __fun2(self):
        print('只有定义的类可以访问')

    def show(self): #普通的实例方法
        self._fun1()  #类本身访问受保护的方法
        self.__fun2() #类本身访问私有方法
        print(self._name) #受保护的实例属性
        print(self.__age) #私有的实例属性


#创建一个学生对象
stu=Student('jarvis',23,'男')

# 类的外部
print(stu._name)
#print(stu.__age)   # AttributeError: 'Student' object has no attribute '__age'. Did you mean: '_name'?

#调用受保护的实例方法
stu._fun1()

#私有方法
#stu.__fun2()   #AttributeError: 'Student' object has no attribute '__fun2'. Did you mean: '_fun1'?

# 私有的实例属性 和 方法是真的不能访问吗?

私有的实例属性 和 方法是真的不能访问吗?!!!

print(stu._Student__age)   #为什么可以这样访问呢??

stu._Student__fun2()

为什么可以这样访问呢??

我们可以用dir()方法查看类所有的方法

print(dir(stu))

运行结果:

D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap9\示例9-8权限控制.py 
jarvis
子类及本身可以访问
23
只有定义的类可以访问
['_Student__age', '_Student__fun2', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_fun1', '_name', 'gender', 'show']
2.1.1 属性的设置
class Student:
    def __init__(self,name,gender):
        self.name=name
        self.__gender=gender  # self.__gender 是私有的实例属性

    # 使用 @property 修饰方法,将方法转成属性使用
    @property
    def gender(self):
        return self.__gender

    #将我们的 gender 这个属性设置为可写属性
    @gender.setter
    def gender(self,value):
        if value!='男' and value!='女':
            print('性别有误,已将性别默认设置为男')
            self.__gender='男'

        else:
            self.__gender=value


#
stu=Student('zhangsan','男')
print(stu.name,'性别是:',stu.gender)    # stu.gender 就会去执行 stu.gender()

# 尝试修改属性值
#stu.gender='女'   # AttributeError: property 'gender' of 'Student' object has no setter

stu.gender='其他'
print('这个学生的性别是:',stu.gender)


运行结果:

D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap9\示例9-9属性的设置.py 
zhangsan 性别是: 男
性别有误,已将性别默认设置为男
这个学生的性别是:

2.2 继承

  • 继承

在这里插入图片描述
代码:

class Person:  # 默认继承了 object
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def show(self):
        print(f'大家好,我叫:{self.name},我今年:{self.age}岁')


# Student 继承 Person 类
class Student(Person):
    # 编写初始化的方法
    def __init__(self, name, age, stuno):
        super().__init__(name, age)  # 调用父类的初始化方法
        self.stuno = stuno


# Doctor 继承Person 类
class Doctor(Person):
    # 编写初始化方法
    def __init__(self, name, age, department):
        super().__init__(name, age)
        self.department = department


# 创建第一个子类对象
stu = Student('Jarvis', 20, '1001')
stu.show()

doctor = Doctor('zhangsan', 35, '外科')
doctor.show()

运行结果:

D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap9\示例9-10继承.py 
大家好,我叫:Jarvis,我今年:20岁
大家好,我叫:zhangsan,我今年:35
  • 多继承
class FatherA():
    def __init__(self, name):
        self.name = name

    def showA(self):
        print('父类A中的方法')


class FatherB():
    def __init__(self, age):
        self.age = age

    def showB(self):
        print('父类B中的方法')


class Son(FatherA, FatherB):
    def __init__(self, name, age, gender):
        # 需要调用两个父类的初始化方法
        FatherA.__init__(self, name)
        FatherB.__init__(self, age)
        self.gender = gender

son=Son('Jarvis',22,'男')   # 调用Son类中的 __init__执行
son.showA()
son.showB()

运行结果:

D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap9\示例9-11多继承.py 
父类A中的方法
父类B中的方法

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

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

相关文章

自定义数据实现SA3D

SA3D&#xff1a;Segment Anything in 3D with NeRFs 实现了3D目标分割 原理是利用SAM(segment anything) 模型和Nerf分割渲染3D目标&#xff0c; SAM只能分块&#xff0c;是没有语义标签的&#xff0c;如何做到语义连续&#xff1f; SA3D中用了self-prompt, 根据前一帧的mask…

基于Python的汽车信息爬取与可视化分析系统

介绍 这款汽车信息网站是基于多项技术和框架设计的全面的汽车信息展示及查询系统。其中&#xff0c;采用了Python Django框架和Scrapy爬虫技术实现数据的抓取和处理&#xff0c;结合MySQL数据库进行数据存储和管理&#xff0c;利用Vue3、Element-Plus、ECharts以及Pinia等前端…

MFC为资源对话框添加消息处理函数和初始化控件

现在我VC6新建了一个对话框工程&#xff1b;又在资源添加了一个新的对话框&#xff0c;并为新的对话框添加了名为CTestDlg的类&#xff1b; 在主对话框的cpp文件包含#include "TestDlg.h"&#xff1b; 在主对话框的cpp文件的OnInitDialog()成员函数中&#xff0c;添…

leetcode 2645. 构造有效字符串的最少插入数-python

题目&#xff1a; 给你一个字符串 word &#xff0c;你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次&#xff0c;返回使 word 有效 需要插入的最少字母数。 如果字符串可以由 “abc” 串联多次得到&#xff0c;则认为该字符串 有效 。 解题方法 1.先判断字符串是否…

快速排序的背后——深入理解时间复杂度

时间复杂度的概念衡量算法性能的重要标准&#xff0c;是算法设计和性能优化中的关键概念&#xff0c;对于编写高效、稳定和可扩展的程序至关重要。但是&#xff0c;初学者对于如何理解和应用时间复杂度则显得较为困难&#xff0c;本文以快速排序为例进一步加深对时间复杂度的理…

云服务器ECS_云主机_服务器托管_计算-阿里云

阿里云服务器ECS英文全程Elastic Compute Service&#xff0c;云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;阿里云提供多种云服务器ECS实例规格&#xff0c;如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等&#xff0c;阿里云百科aliyunbai…

Logstash配置详解

一、配置文件 Logstash配置文件位于Logstash安装目录下bin/logstash.conf 启动命令: logstash -f logstash.conf文件描述logstash.yml配置Logstash的yml。pipelines.yml包含在单个Logstash实例中运行多个管道的框架和说明。jvm.options配置Logstash的JVM&#xff0c;使用此文…

Unity图片导入趣事随笔

像这样的png格式的图片&#xff0c;直接导入unity时unity会把没有像素的部分用黑色填充&#xff0c;并根据填充部分自动生成alpha通道。看起来alpha通道是不能手动覆盖的&#xff0c;即使在ps中手动添加一个alpha通道&#xff0c;并添加覆盖值。 导出后也会发现这没有任何意义&…

环信服务端下载消息文件---菜鸟教程

前言 在服务端&#xff0c;下载消息文件是一个重要的功能。它允许您从服务器端获取并保存聊天消息、文件等数据&#xff0c;以便在本地进行进一步的处理和分析。本指南将指导您完成环信服务端下载消息文件的步骤。 环信服务端下载消息文件是指在环信服务端上&#xff0c;通过调…

Self-Attention

前置知识&#xff1a;RNN&#xff0c;Attention机制 在一般任务的Encoder-Decoder框架中&#xff0c;输入Source和输出Target内容是不一样的&#xff0c;比如对于英-中机器翻译来说&#xff0c;Source是英文句子&#xff0c;Target是对应的翻译出的中文句子&#xff0c;Attent…

【新特性演示】YOLOv8实现旋转对象检测

学习《OpenCV应用开发&#xff1a;入门、进阶与工程化实践》一书 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; YOLOv8旋转对象检测 YOLOv8框架在在支持分类、对象检测、实例分割、姿态评估的基础上更近一步&#xff0c;现已经支持旋转对象…

【微信小程序独立开发1】项目提出和框架搭建

前言&#xff1a;之前学习小程序开发时仿照别人的页面自己做了一个商城项目和小说项目&#xff0c;最近突发奇想&#xff0c;想从0开发一个关于《宠物日记》的小程序&#xff0c;需求和页面都由自己设计&#xff0c;将在这记录开发的全部流程和过程中遇到的难题等... 1、搭建小…

AI Table应用程序接口表的格式说明和作用

AI Table 首先全拼不是AI人工智能表&#xff0c;而是Application Interface Table应用程序接口表。此表按照AUTOSAR的格式规范去定义&#xff0c;并且使用此Excel 表格生成相应的应用软件组件Arxml文件。下面就让我们按照AUTOSAR_EXP_AIUserGuide.pdf文档官方解释描述文件去看看…

Camtasia2024屏幕录像和视频编辑软件

做网络教学视频&#xff0c;开发微课程&#xff0c;用得最多的就是录屏视频编辑&#xff0c;而在这类软件中我只推荐Camtasia Studio。随着Camtasia Studio的更新&#xff0c;其功能越来越完善&#xff0c;用户界面越来越友好&#xff0c;除了安装更加简单&#xff0c;汉化只需…

51-10 多模态论文串讲—ALBEF 论文精读

今天我们就来过一下多模态的串讲&#xff0c;其实之前&#xff0c;我们也讲了很多工作了&#xff0c;比如说CLIP&#xff0c;还有ViLT&#xff0c;以及CLIP的那么多后续工作。多模态学习在最近几年真的是异常的火爆&#xff0c;那除了普通的这种多模态学习&#xff0c;比如说视…

管桩生产管理系统 | 任务单自动计算了解一下!

库存、生产、运输科学化管理 采用自主研发的数智控制技术 对管桩生产登记、管桩配料 管桩混凝土分料生产过程进行管理 不仅能管生产 对于成品库存、管桩运输思伟都有 对应系统模块支持科学管理 系统提升管桩量产效率至少 30% 降低人工重复工作量 60% 给您 100% 畅快体验 …

【开源】基于JAVA的固始鹅块销售系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固始鹅块模块2.4 鹅块订单模块2.5 评论管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 鹅块类型表3.2.2 鹅块表3.2.3 鹅块订单表3.2.4 鹅块评论表 四、系统展示五、核心代码5.…

Ansible的切片特性与多机器选取

一、【概述】 本文介绍一下Ansible的多机器选取和切片特性&#xff0c;这个还是一个比较有用的技巧&#xff0c;可以快速选取仓库中我们需要的机器清单。 因为该特性可能与其他工具语法稍微有些不一样&#xff0c;时间长了会忘&#xff0c;值得记录一下 二、【具体说明】 1…

【Maven】005-基于 IDEA 进行 Maven 依赖管理

【Maven】005-基于 IDEA 进行 Maven 依赖管理 文章目录 【Maven】005-基于 IDEA 进行 Maven 依赖管理一、Maven 依赖管理二、GAVP 再说明三、Maven 工程依赖管理配置1、依赖配置2、版本统一声明和使用3、依赖范围说明4、Maven工程依赖下载失败错误解决&#xff08;重点&#xf…

行为驱动测试 python + behave

行为驱动&#xff0c;Behave-Driven Development&#xff0c;简称BDD。在行为驱动中运用结构化的自然语言描述场景测试&#xff0c;然后将这些结构化的自然语言转化为可执行的测试脚本或者其他形式。BDD的一种优势是&#xff0c;它建立了一种通用语言&#xff0c;而这种语言可以…