首页 > 编程语言 >Python高阶---魔法方法

Python高阶---魔法方法

时间:2024-05-06 11:57:58浏览次数:19  
标签:__ name Python self --- print 高阶 age 属性

魔法方法:通过dir(函数名)查看到的方法中以双下划线开始,以双下划线结束的方法。

=========================================

class Student:
def init(self, name, age):
"""
负责初始化类的实例,实例是由__new__方法传递过来的,也就是这里的self
:param name:
:param age:
"""
self.name = name
self.age = age
self.f = open('./txt/1.txt')

def __repr__(self):
    """
    类的自我描述
    一般形式为:类名[attr]=value
    :return:
    """
    return 'Student[name=' + self.name+', age=' + str(self.age) + ']'

def __del__(self):
    """
    自动销毁、删除对象
    :return:
    """
    print('__del__方法被调用')
    self.f.close()

stu = Student('zhangsan', 18)
print(stu)
print(stu.repr())

==================================

class Students:
def new(cls, *args, **kwargs):
"""
负责创建类的实例
:param args:
:param kwargs:
"""
print('__new__方法被调用')
return object.new(cls)

def __init__(self, name, age):
    """
    负责初始化类的实例,实例是由__new__方法传递过来的,也就是这里的self
    :param name:
    :param age:
    """
    print('__init__方法被调用')
    self.name = name
    self.age = age

stus = Students('zhangsan', 18)
print(stus)

==================================

class NewInt(int):
def new(cls, value):
print('__new__方法被调用')
return int.new(cls, abs(value))

a = NewInt(-4.56)
print(a)

==================================

实现类的单例模式

class Student1:
__isinstance = False # 保存我们已经创建好的实例
def new(cls, value):
if not cls.__isinstance: # 没有创建过任何实例
cls.__isinstance = object.new(cls)
return cls.__isinstance # 如果有实例,则直接返回实例

def __init__(self, name):
    """
    负责初始化类的实例,实例是由__new__方法传递过来的,也就是这里的self
    :param name:
    """
    print("我是{}。".format(name))

stu1 = Student1('zhangsan') # 内存地址相同
stu2 = Student1('lisi') # 内存地址相同

==========================================

属性管理

dir(): 查看对象的方法和属性的名字
dir(): 是一个函数, 查看属性
print(dir([])) # 查看列表有哪些属性

==================================

属性管理

dir(): 查看对象的方法和属性的名字

dir(): 是一个函数, 查看属性

print(dir([]))

class Students2:

def __init__(self, name, age):
    """
    负责初始化类的实例,实例是由__new__方法传递过来的,也就是这里的self
    :param name:
    :param age:
    """
    print('__init__方法被调用')
    self.name = name
    self.__age = age   # 私有属性

stus2 = Students2('zhangsan', 18)
print(dir(stus2))
print(stus2._Students2__age) # 可以查看私有属性
print(dir(Students2))
print(stus2.dict) # 作用于对象时,只打印该对象拥有的所有属性名和属性值,包含私有属性
print(Students2.dict) # 作用于类时,只打印共享的类属性以及类的所有方法
print(stus2.dict['name']) #
stus2.dict['name'] = 'lisi' # 设置name的值
stus2.dict['id'] = 's001' # 动态增加属性
print(stus2.id)

==================================

__getattribute__属性:访问对象的任意属性时被自动调用

class Students3:
def init(self, name, age):
"""
:param name:
:param age:
"""
print('__init__方法被调用')
self.name = name
self.age = age

def __getattribute__(self, item):
    try:
        print('__getattribute__方法被调用了,调用的属性为:', item)
        # return self.name   # 会造成死循环
        return super().__getattribute__(item)

    except AttributeError as e:
        print(e)
        print('访问了未定义属性,请检查')

stu3 = Students3('zhangsan', 18)
stu3.name
stu3.xxx

==============================

__setattr__当对xxx属性赋值时被调用

__delattr__当删除对象的xxx属性时被调用

class Students5:

def __init__(self, name, age):
    """
    :param name:
    :param age:
    """
    print('__init__方法被调用')
    self.name = name
    self.age = age

def __getattribute__(self, item):
    try:
        print('__getattribute__方法被调用了,调用的属性为:', item)
        # return self.name   # 会造成死循环
        return super().__getattribute__(item)

    except AttributeError as e:
        print(e)
        print('访问了未定义属性,请检查')
        return 'default'

    # print('调用了{}属性:'.format(item))
    # return super().__getattribute__(item)

def __getattr__(self, item):
    # 当__getattribute__没有处理AttributeError的时候,python会调用重写的__getattr__
    print('__getattr__方法被调用了', item)

def __setattr__(self, key, value):
    print('程序设置属性{}'.format(key))
    if key == 'age':
        if value < 18:
            raise Exception('age的值必须大于等于18')
        else:
            self.__dict__[key] = value   # 这句必须写,保证当属性的值正确时可以赋值给属性
    else:
        self.__dict__[key] = value

def __delattr__(self, item):
    print('__delattr__被调用')

stu5 = Students5('zhangsan', 18)
print(stu5.name)
stu5.name = 'lisi'
stu5.age = 20
print(stu5.age)
del stu5.age

=====================================

标签:__,name,Python,self,---,print,高阶,age,属性
From: https://www.cnblogs.com/jackchen28/p/18174302

相关文章

  • JavaScript-DOM简介
    JavaScript-DOM简介之前我们说过JavaScript有三部分组成ECMAscript,BOM,DOM,之前我们都在了解JavaScript的语法即ECMAScript,今天我们开始了解DOM(文档对象模型(DocumentobjectModel),操作网页上的元素的API)什么是DOMDOM:DocumentObjectModel,文档对象模型。DOM为文档提供了结......
  • *uniapp-vue3-ts项目配置eslint+prettier+husky
    代码检查工具:Eslint代码格式化工具:prettierhusky:Git客户端增加了钩子(hooks)功能,使得在特定阶段执行一系列流程,以保证每一个commit的正确性vscode安装插件:    安装eslint+prettier:npmi-Deslintprettiereslint-plugin-vue@vue/eslint-config-prettier@vu......
  • Razavi - RF Microelectronics的笔记 - Differential Output Current
    Onpage400,example6.26,weareaskedtoanalyzeadouble-balancedcircuitonits\(IP_2\).Idon'tgetwheredoes(6.127)comefrom.Sincethere'snoexplanationon(6.127),Iguessthisequationisobvious.SoIreducetheproblemandtry......
  • [转帖]Unnecessary GCLocker-initiated young GCs
    https://www.cnblogs.com/zhangshengdong/p/9196128.html DetailsType: BugResolution:FixedPriority: P3FixVersion/s:14AffectsVersion/s:7u60, 8, 8u20, 8u40, 9, 11, 13Component/s:hotspotLabels:8u20-defer-SQE-OK 8u20......
  • Python文本统计与分析从基础到进阶
    本文分享自华为云社区《Python文本统计与分析从基础到进阶》,作者:柠檬味拥抱。在当今数字化时代,文本数据无处不在,它们包含了丰富的信息,从社交媒体上的帖子到新闻文章再到学术论文。对于处理这些文本数据,进行统计分析是一种常见的需求,而Python作为一种功能强大且易于学习的编程语言......
  • Oracle【ORA-00600 internal error code arguments [2662]】恢复一例
    背景1.数据库版本:11.2.0.42.未开启归档3.没有备份:无RMAN备份、无DUMP备份4.数据库redolog全部删除。解决思路:Oracle的隐含参数:_allow_resetlogs_corruption=TRUESYS>altersystemset"_allow_resetlogs_corruption"=truescope=spfile;数据库关闭数据库,在启动SQL......
  • [数据分析与可视化] Python绘制数据地图3-GeoPandas使用要点-转载
    [数据分析与可视化]Python绘制数据地图3-GeoPandas使用要点 本文主要介绍GeoPandas的使用要点。GeoPandas是一个Python开源项目,旨在提供丰富而简单的地理空间数据处理接口。GeoPandas扩展了Pandas的数据类型,并使用matplotlib进行绘图。GeoPandas官方仓库地址为:GeoPandas。Ge......
  • Paper Reading: Tri-objective optimization-based cascade ensemble pruning for dee
    目录研究动机文章贡献本文方法染色体编码适应度函数评估进化过程最终解选择级联剪枝框架实验结果数据集和实验设置三目标优化的效果不同集成规模的算法比较算法在不同数据集上的比较优点和创新点PaperReading是从个人角度进行的一些总结分享,受到个人关注点的侧重和实力所限,可能......
  • 208. 实现 Trie (前缀树)-python
    Trie(发音类似"try")或者说前缀树是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现Trie类:Trie()初始化前缀树对象。voidinsert(Stringword)向前缀树中插入字符串word。booleansearch(St......
  • Docker-compose安装(Centos7)
    卸载原来的docker-composerm-rf/usr/local/bin/docker-composerm-rf/usr/bin/docker-compose下载docker-composecurl-L"https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname-s)-$(uname-m)"-o/usr/local/bin/docker-compos......