Python入门-面向对象

news2025/4/6 18:44:24

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中的方法

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

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

相关文章

九州金榜|孩子不自信,根源在父母,莫让孩子失去自我

家长在看待孩子时&#xff0c;往往会忽视孩子内在的真实感受&#xff0c;以自己的想法去要求孩子。 聚会聚餐&#xff0c;就让孩子去表演节目&#xff1b; 出门游玩&#xff0c;看到舞台就让孩子去参加&#xff1b; 在家休息&#xff0c;让孩子独自一人睡觉... 这些行为孩子…

红日靶场1

文章目录 红日靶场的渗透思路一、靶场搭建网络拓扑1.win7配置2&#xff0c;win2003配置3&#xff0c;server2008配置4&#xff0c;kali配置 二、渗透流程一.信息收集二&#xff0c;获取webshell1.进入后台之后&#xff0c;可以选择插入一句话木马------失败2.在日志中插入木马3…

odoo14 动态改变进度条颜色(widget=“progressbar“)底色,边框,进度颜色

在odoo14中当时使用&#xff1a;widget"progressbar" 时默认表现为&#xff1a; 但我想在不同的比例展示不同的颜色&#xff0c;和其他的样式颜色&#xff1a; tree视图 form视图 也一样&#xff1a; 说明&#xff1a;进度0-30为蓝色&#xff0c;31-80为黄色&…

【C++ 程序设计入门基础】- 第4节-函数

1、函数 函数是对实现某一功能的代码的模块化封装。 函数的定义&#xff1a; 标准函数&#xff1a; 输入 n 对整数的 a、b &#xff0c;输出它们的和。 #include <iostream> #include <windows.h> using namespace std;int add(int a,int b);//函数原型声明int…

PyCharm连接服务器 - 2

文章目录 PyCharm连接服务器-21.如何连接服务器&#xff1f;2.如何在终端窗口打开SSH连接&#xff1f;3.Terminal终端出现中文乱码的解决办法&#xff1f;4.如何查看远程服务器的树目录结构&#xff1f;5.如何配置代码同步&#xff1f;6.如何为项目配置远程服务器中的python解释…

C#进阶学习

目录 简单数据结构类ArrayList声明增删查改遍历装箱拆箱 Stack声明增取查改遍历装箱拆箱 Queue声明增取查改遍历 Hashtable声明增删查改遍历装箱拆箱 泛型泛型分类泛型的作用泛型约束 常用泛型数据结构类List声明增删查改遍历 Dictionary声明增删查改遍历 LinkedList声明增删查…

05.neuvector网络学习与管控实现

原文链接&#xff0c;欢迎大家关注我的github 一、网络的策略学习 1.1.非主机模式的网络连接学习 agent进程侧&#xff1a; 调用taskAddContainer->taskInterceptContainer->programDP->DPCtrlAddTapPort为所有非host模式的容器向dp传送 DPAddTapPortReq对象数据.&…

OpenGL 网格拾取坐标(Qt)

文章目录 一、简介二、代码实现三、实现效果参考资料一、简介 有时候我们希望通过鼠标来拾取某个网格中的坐标,这就涉及到一个很有趣的场景:光线投射,也就是求取一条射线与网格的交点,这里如果我们采用普通遍历网格中的每个面片的方式,当网格的面片数据量很大时计算效率就…

版本控制神器之Git深入介绍

Git简介 Git&#xff08;全局信息追踪器&#xff09;。 Git是一个分布式版本控制工具&#xff0c;Git的使用中央仓库不是必须的&#xff0c;用户本地就是一个完整的版本仓库&#xff0c;代码的前进、回退、删除等等操作都可以直接在本地进行&#xff0c;不需要中央仓库。但是…

Java多线程:初识多线程!左手画方,右手画圆

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、线程与进程二、创建线程方法1、继承Thread类2、实现Runnable接口3、两者区别4、举个栗子5、简洁写法Ⅰ、Thread匿名内部类写…

vue开发H5 实现滑动图片获取验证码

<template><div><van-button type"primary" click"sendVerification">获取验证码</van-button><van-popupv-model"captchaVisible"closeableposition"bottom"class"login-captcha":close-on-cli…

基于JAVA+SSM框架开发的志愿者服务管理系统设计与实现【附源码】

&#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#x1f4dd; &#x1f680;&#x1f680;&#x1f6…

强化学习(一)简介

强化学习这一概念在历史上来源于行为心理学&#xff0c;来描述生物为了趋利避害而改变自己行为的学习过程。人类学习的过程其实就是为达到某种目的不断地与环境进行互动试错&#xff0c;比如婴儿学习走路。强化学习算法探索了一种从交互中学习的计算方法。 1、强化学习 强化学…

31 树的存储结构一

无法直接用数组表示树的逻辑结构&#xff0c;但是可以设计结构体数组对节点间的关系进行描述&#xff1a;【如表】 这样做的问题&#xff1a; 可以利用 组织链表 parent指针&#xff1a; 注意&#xff1a;树结点在 组织链表 中的位置不代表树的任何逻辑关系 树的架构图&#xf…

DNS 在互联网中的作用是什么?

互联网的运作离不开DNS&#xff0c;那么DNS到底是什么&#xff1f;它在互联网中发挥着怎样的作用呢&#xff1f; DNS&#xff0c;全称为Domain Name System&#xff0c;即域名系统&#xff0c;是互联网的一项基础设施。它负责将人们易于记忆的域名&#xff08;如www.example.…

MySQL 从零开始:06 数据检索

文章目录 1、数据准备2、限制结果3、完全限定名4、排序检索 所谓数据检索&#xff0c;就是前面所讲的”增删改查“的”查“。 注&#xff1a;本文使用的“行”指数据表中的“记录”&#xff0c;“列”指数据表中的“字段”。 在第四节《表的增删改查》中已经介绍了 select 查询…

C# Cad2016二次开发api(三)

直线 Line 属性中文数据类型作用Length长度double直线的长度Angle角度double直线的弧度&#xff0c;0~2πDelta增量Vector3d起点到终点的向量Normal法向向量Vector3d直线所在平面的法向单位向量Thickness厚度doubleEndPoint终点Point3d直线的终点StartPoint起点Point3d直线的起…

Memory Wall in Neural Network Inference

Memory Wall in Neural Network Inference 神经网络推理的瓶颈在于访存带宽&#xff0c;通常无法发挥出加速器的全部算力。本文总结了目前常用的推理加速器及其设计&#xff0c;并分析了常用神经网络的访存瓶颈。文章大部分内容参考自Computer Architecture: A Quantitative A…

JavaScript基础(26)_dom增删改练习

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><title>DOM增删改练习</title><link rel"stylesheet" href"../browser_default_style/reset.css"><style>table {borde…

软件测试|Selenium StaleElementException异常的原因与方法

简介 在使用Selenium进行Web自动化测试时&#xff0c;我们可能会遇到StaleElementException异常。这个异常通常在我们操作一个之前已经找到的元素时抛出&#xff0c;但该元素已经不再处于DOM树中&#xff0c;导致元素过时&#xff08;stale&#xff09;。本文将介绍StaleEleme…