Python(关于属性和类详细代码解释)

news2024/12/23 3:11:21

动态绑定属性

class Student:
    # 类属性:定义在类中,方法外的变量
    school = '北京xxx教育'
    print(type(school))  # 定义在类里面所以属性不变

    # 类属性初始化方法
    def __init__(self, xm, age):  # xm,age是方法的参数,是局部变量,xm,age的作用域整个__init__方法
        # 即xm,age只能在类里面使用,要想在其他地方使用需要定义类的实例属性
        self.name = xm  # 左例是实例属性,xm是局部变量,将局部变量的值xm赋值给实例属性self.name
        self.age = age  # 实例的名称和局部的可以相同

    # 定义在类中的函数,称为方法,自带一个参数self
    def show(self):
        print(f'我叫:{self.name}.今年:{self.age}岁了')
#创建两个Student类型的对象
stu=Student('xx',10)
stu2=Student('hh',20)
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()

1、单下划线开头的属性或方法表示protected受保护的成员,这类成员被视为仅供内部使用,允许类本身和子类进行访问,但实际它可以被外部代码访问。

2、双下划线开头表示private私有的成员,这类成员只允许定义该属性或方法的类本身进行访问

3、收尾双下划线表示特殊的方法

class Student():
    def __init__(self,name,age,gender):
        self._name=name #单下划线
        self.__age=age
        self.gender=gender
    def _fun1(self):
        print('受保护的')
    def __fun2(self):#私有的
        print('只有定义的类可以访问')
    def show(self):#普通类
        self._fun1()
        self.__fun2()

stu=Student('xx',10,'女')
#类的外部
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()

# print(dir(stu))#内置函数
#['_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']

class Student:
    def __init__(self,name,gender):
        self.name=name
        self.__gender=gender#self.__gender 是私有的实例属性
      #以上是使用下划线强制访问
    #使用装饰器(以@开头的)将方法转成属性使用
    @property
    def gender(self):
        return self.__gender

#将gender修改为可变属性
    @gender.setter#不能@property
    def gender(self,value):
        if value!='男'and value!='女':
            print('性别有误,默认为女')
        else:
         self.__gender=value


stu=Student('xy','女')
print(stu.name,'性别',stu.gender)#属性变成了方法,stu。gender()
#变成方法之后就无法修改属性值
# stu.gender='男'#AttributeError: property 'gender' of 'Student' object has no setter
#要想修改属性为可变属性,应该在前面修改代码12行
stu.gender='男'
print(stu.name,'性别',stu.gender)

Python中面向对象的三大特征:

一个子类可以继承N个父类;一个父类也可以拥有N多个子类;如果一个类没有继承任何类,那么默认继承object类。

class Person:
    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('xx',20,'1001')
stu.show()
#创建第二个子类对象
doctor=Doctor('yy',10,'外科')
doctor.show()
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('xx',20,'女')#调用Son类中的__init__执行
son.showA()
son.showB()
class Person:
    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

    def show(self):
        #调用父类中的方法
        super().show()
        print(f'学号为:{self.stuno}')


#Doctor继承Person类
class Doctor (Person):
    def __init__(self,name,age,department):
         super().__init__(name,age)
         self.department=department

    def show(self):
        #super().show()#调用父类的show方法
        print(f'我叫{self.name},我今年{self.age}岁,我的工作科室是:{self.department}')#不调用父类,隔断的方法

        #编写初始化方法

stu=Student('xx',20,'1001')
stu.show()#先调用子类的show方法,子类没有去父类中调用
doctor=Doctor('yy',10,'外科')
doctor.show()#我叫yy,我今年10岁,我的工作科室是:外科

class Person():
    def eat(self):
        print('人,吃五谷杂粮')

class Cat():
    def eat(self):
        print('猫,喜欢吃鱼')

class Dog():
    def eat(self):
        print('狗喜欢啃骨头')

#这三个类都有一个同名的方法,eat
#编写函数
def fun(obj):#obj是函数的形式参数,定义处不用知道这个形参的数据类型
    obj.eat()#通过变量obj(对象)调用eat方法

#创建三个类的对象
per=Person()
cat=Cat()
dog=Dog()

#调用fun函数
fun(per)
fun(cat)
fun(dog)

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

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

#创建Person 类的对象
per=Person('xx',20)
print(dir(per))#查看person类型
#['__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__', 'age', 'name', 'show']
#以上除了'age', 'name', 'show',其他均是由object父类中调用而来

#重写父类的str方法
class Person(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age

        #方法重写
    def __str__(self):
        return'这是一个具有name和age两个实例属性'#返回值是一个字符串
#创建person类的对象
per=Person('xx',19)
print(per)#__str__方法中的内容  直接输出对象名,实际上是调用__str__方法而不是内存地址
print(per.__str__())
#以上结果均为:
#这是一个具有name和age两个实例属性
#这是一个具有name和age两个实例属性

a=10
b=20
print(dir(a))#使用内置函数查看Python中一切对象
print(a.__add__(b))
print(a.__sub__(b))
print(f'{a}<{b}吗?',a.__lt__(b))
print(f'{a}<={b}吗?',a.__le__(b))
print(f'{a}=={b}吗?',a.__eq__(b))
print('-'*40)
print(f'{a}>{b}吗?',a.__gt__(b))
print(f'{a}>={b}吗?',a.__ge__(b))
print(f'{a}!={b}吗?',a.__ne__(b))

print('-'*40)
print(a.__mul__(b))
print(a.__truediv__(b))
print(a.__mod__(b))
print(a.__floordiv__(b))
print(a.__pow__(2))

class A:
    pass
class B:
    pass
class C(A,B):
    def __init__(self,name,age):
        self.name=name
        self.age=age

#创建类的对象
a=A()
b=B()
#创建C类对象
c=C('xx',20)

print('对象a的属性字典:',a.__dict__)#对象a的属性字典: {}
print('对象b的属性字典:',b.__dict__)#对象b的属性字典: {}
print('对象b的属性字典:',c.__dict__)#对象b的属性字典: {'name': 'xx', 'age': 20}

print('对象a所属的类:',a.__class__)#对象a所属的类: <class '__main__.A'>
print('对象b所属的类',b.__class__)#对象b所属的类 <class '__main__.B'>
print('对象c所属的的类:',c.__class__)#对象c所属的的类: <class '__main__.C'>

print('A类的父类元组',A.__bases__)
print('B类的父亲元组',B.__bases__)
print('c类的父类元组',C.__bases__)
#A类的父类元组 (<class 'object'>,)
#B类的父亲元组 (<class 'object'>,)
#c类的父类元组 (<class '__main__.A'>, <class '__main__.B'>)

print('A类的父类:',A.__base__)
print('B类的父类:',B.__base__)
print('c类的父亲',C.__base__)#A类,如果继承了N多个父类,结果只是显示第一个父类
# c类的父亲 <class '__main__.A'>

print('A类的层次结构',A.__mro__)
print('B类的子类列表:',B.__mro__)
print('C类的子类列表:',C.__mro__)#C类继承了A类,B类,间接继承了object类

print('A类的子类列表:',A.__subclasses__())#A的子类有C类,A类的子类列表: [<class '__main__.C'>]
print('B类的子类列表:',B.__subclasses__())#B类的子类列表: [<class '__main__.C'>]
print('C类的子类列表:',C.__subclasses__())#C类的子类列表: []

class CPU():
    pass
class Disk():
    pass

class Computer():
    def __init__(self,cpu,disk):
        self.cpu=cpu
        self.disk=disk

cpu=CPU()#创建了一个CPU对象
disk=Disk()#创建了一个硬盘对象

#创建一个计算机对象
com=Computer(cpu,disk)
#变量(对象)的赋值
com1=com
print(com,'子对象的内存地址:',com.cpu,com.disk)
print(com1,'子对象的内存地址',com1.cpu,com1.disk)
#赋值不会创建新的空间
# ject at 0x0000024FA3AA4B30> 子对象的内存地址: <__main__.CPU object at 0x0000024FA3AA4B90> <__main__.Disk object at 0x0000024FA3AA4B00>
# <__main__.Computer object at 0x0000024FA3AA4B30> 子对象的内存地址 <__main__.CPU object at 0x0000024FA3AA4B90> <__main__.Disk object at 0x0000024FA3AA4B00>

#类对象的浅拷贝
import copy
com2=copy.copy(com)
print(com,'子对象内存地址为',com.cpu,com.disk)
print(com2,'子对象内存地址为',com2.cpu,com2.disk)
#<__main__.Computer object at 0x000001F45ACB4EC0> 内存地址为 <__main__.CPU object at 0x000001F45ACB4F20> <__main__.Disk object at 0x000001F45ACB4E90>
#<__main__.Computer object at 0x000001F45ACB4FE0> 内存地址为 <__main__.CPU object at 0x000001F45ACB4F20> <__main__.Disk object at 0x000001F45ACB4E90>
#产生了一个新的对象,但是子对象不变

#类对象的深拷贝
print('-'*40)
com3=copy.deepcopy(com)#com3新产生的对象,com3的对象,CPU,disk也会重新创建
print(com,'子对象内存地址',com.cpu,com.disk)
print(com3,'子对象内存地址',com3.cpu,com3.disk)
#<__main__.Computer object at 0x0000020B755F5280> 子对象内存地址: <__main__.CPU object at 0x0000020B755F52E0> <__main__.Disk object at 0x0000020B755F5250>
#<__main__.Computer object at 0x0000020B755F53A0> 子对象内存地址 <__main__.CPU object at 0x0000020B755F52E0> <__main__.Disk object at 0x0000020B755F5250>
#创建新对象子对象也会改变

访问私有属性的语法:对象名._类名__属性名

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

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

相关文章

解决Centos不支持docker命令行tab提示问题!!!

一、CentOS不支持Docker Tab提示 在使用CentOS操作系统时&#xff0c;有些用户可能会遇到不能自动补全Docker命令的问题。这是因为CentOS默认不支持Docker Tab提示功能&#xff0c;需要手动配置才能实现。在这篇科普文章中&#xff0c;我们将介绍如何解决这个问题&#xff0c;…

Springer旗下中科院2区TOP,国人优势大!

关注GZH【欧亚科睿学术】&#xff0c;第一时间了解期刊最新动态&#xff01; 1 通信网络类 【期刊简介】IF&#xff1a;4.0-5.0&#xff0c;JCR1区&#xff0c;中科院3区 【出版社】ELSEVIER出版社 【检索情况】SCIE&EI双检&#xff0c;CCF-C类 【征稿领域】通信网络的…

这本vue3编译原理开源电子书,初中级前端竟然都能看懂

前言 众所周知vue提供了很多黑魔法&#xff0c;比如单文件组件(SFC)、指令、宏函数、css scoped等。这些都是vue提供的开箱即用的功能&#xff0c;大家平时用这些黑魔法的时候有没有疑惑过一些疑问呢。 我们每天写的vue代码一般都是写在*.vue文件中&#xff0c;但是浏览器却只…

大模型面试之LoRA

LoRA的解释&#xff1a;一种高效微调预训练神经网络的方法 LoRA 解决的问题&#xff1a; &#x1f538; 2021年初&#xff0c;微软与OpenAI合作探索GPT-3的商业可行性。 &#x1f538; 发现仅仅通过提示&#xff08;prompting&#xff09;不足以完成生产任务&#xff0c;例如…

C++:标准模板库(STL)介绍

1.STL基本概念 从C到C&#xff0c;C语言的核心优势之一就是便于软件的重用。前面我们提到过C程序的面向对象思想&#xff0c;即继承和多态、标准类库等可以实现重用。除此之外&#xff0c;通过泛型程序设计(generic programming)的思想&#xff0c;即模板机制以及标准模板库ST…

微软:警惕利用VMware ESXi进行身份验证绕过攻击

微软于7月29日发布警告&#xff0c;称勒索软件团伙正在积极利用 VMware ESXi 身份验证绕过漏洞进行攻击。 该漏洞被追踪为 CVE-2024-37085&#xff0c;由微软安全研究人员 Edan Zwick、Danielle Kuznets Nohi 和 Meitar Pinto 发现&#xff0c;并在 6 月 25 日发布的 ESXi 8.0 …

Vatee万腾平台:助力企业数字化转型的坚实伙伴

在数字化浪潮席卷全球的今天&#xff0c;企业数字化转型已成为不可逆转的趋势。面对这一挑战与机遇并存的时代&#xff0c;Vatee万腾平台凭借其深厚的行业洞察、先进的技术实力和丰富的实践经验&#xff0c;成为了众多企业数字化转型道路上的坚实伙伴。 一、定制化解决方案&…

锐捷RCNA | ARP协议原理与应用与DHCP协议原理及应用

一、ARP协议原理与应用 OSI参考模型将网络划分为7层&#xff0c;IP地址工作在第三层网络层中&#xff0c;MAC地址工作在第二层数据链路层。 在以太网发送IP数据包时&#xff0c;先封装网络层的包头再封装数据链路层的包头&#xff0c;由于在发送时只知道目标IP地址而不知道MA…

神经网络实现数字识别(机器学习)

我们有很多0到9的图片集&#xff0c;我们要训练一个网络来自动识别数字&#xff0c;我们有20*20的图像5000个。 把图片展平&#xff0c;这样每个记录就有400个特征&#xff0c;最后一列是标签值&#xff0c;1-9表示数字1-9&#xff1b;10表示数字0。数据集&#xff1a;ex_2/ex…

【设计模式:单例模式】

单例模式的特点&#xff1a; 单例类只允许一个实例单例类必须自己创造自己的唯一实例单例类必须给所有其他对象提供这一实例 单例模式底层如何实现&#xff1a; 私有化构造函数&#xff0c;类外部无法创造类对象&#xff0c;实现了单例类只允许有一个实例对象的特点类定义中含有…

vue3+g2plot之瀑布图

基础瀑布图 - 每月收支情况 效果预览: 核心代码: import {Waterfall } from @antv/g2plot;const data = [{type: 日用品, money: 120 },{type: 伙食费, money: 900 },{type: 交通费, money: 200 },{type: 水电费, money: 300 },{type: 房租, money: 1200 },{type: 商场消…

MyBatis批量更新:报错The error occurred while setting parameters

使用mybatis批量更新时&#xff0c;报以下错误。反复检查过mysql语句没有任何问题。而且本地可以正常执行&#xff0c;生产环境却报错。起初怀疑是数据表&#xff0c;把生产环境表导入本地测试后依然没有问题。数据表没问题就定位到数据库&#xff0c;先检查本地数据库链接与生…

家庭教育系列—剑桥通用英语五级考试介绍

文章目录 1. 背景介绍2. 详细介绍2.1 **KET&#xff08;Key English Test&#xff09;&#xff1a;基础英语考试**2.2 **PET&#xff08;Preliminary English Test&#xff09;&#xff1a;初级英语考试**2.3 **FCE&#xff08;First Certificate in English&#xff09;&#…

自定义类加载器 1.继承ClassLoader 2.findClass 3.defineClass

一、自定义类加载器 1.自定义 2.使用 总结&#xff1a;这种情况&#xff0c;由于loadClass会采用双亲委派机制&#xff0c;如果类已经被加载&#xff0c;那么就不会重复加载。 二、热部署的实现原理 使用loadClass&#xff0c;发现加载是同一个类 使用findClass实现&#xf…

【arxiv 2024】Latte: Latent Diffusion Transformer for Video Generation

【arxiv 2024】Latte: Latent Diffusion Transformer for Video Generation 一、前言Abstract1 Introduction2 Related Work3 Methodology3.1 Preliminary of Latent Diffusion Models3.2 The model variants of Latte3.3 The empirical analysis of Latte3.3.1 Latent video c…

测试环境领域到测试环境产品

作者&#xff1a;攻心 去年之前&#xff0c;阿里巴巴的淘天集团测试环境是以领域方式运作&#xff1a;不局限测试环境治理本身&#xff0c;从测试模式方法论及用好测试环境思路引领集团测试环境治理。领域运作最难的是“统一思想”。业务进一步细分调整后&#xff0c;测试环境治…

Xilinx FPGA:vivado SPI实现FLASH通信

一、实验要求 要求使用SPI协议实现对flash芯片的页编程、读操作、页擦除等功能。 二、模块划分 大概的时序图&#xff1a; 三、程序设计 &#xff08;1&#xff09;接收端模块 timescale 1ns / 1ps module uart_rx(input sys_clk ,input …

Mongodb新增文档、查询文档、更新文档、删除文档

文章目录 1、新增文档1.1、进入容器1.2、向集合插入一个新文档1.3、查询文档1.4、向集合插入一个或者多个文档 2、查询文档2.1、查询年龄等于202.2、查询年龄是20的男性2.3、查询年龄是20或者性别是男2.4、查询年龄小于232.5、查询年龄小于等于232.6、查询大于等于232.7、查询年…

新型蜜罐有哪些?未来方向如何?

前言&#xff1a;技术发展为时代带来变革&#xff0c;同时技术创新性对蜜罐产生推动力。 一、新型蜜罐的诞生 技术发展为时代带来变革&#xff0c;同时技术创新性对蜜罐产生推动力&#xff0c;通过借鉴不同技术思想、方法&#xff0c;与其它技术结合形成优势互补&#xff0c;…

Docker 搭建 Minio 容器

Docker 搭建 Minio 容器 (完整详细版) 简介&#xff1a; Minio 是一个基于Apache License v2.0开源协议的对象存储服务&#xff0c;虽然轻量&#xff0c;却拥有着不错的性能。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据。 例如图片、视频、日…