上穷碧落下黄泉,两处茫茫皆不见——python面向对象类型方法和反射_python某市新建成了地铁,车票价格如下:1—4站2元,5—7站3元,8—9站4元,10站以上5-程序员宅基地

技术标签: python基础  python  

临邛道士鸿都客,能以精诚致魂魄。
为感君王辗转思,遂教方士殷勤觅。
排空驭气奔如电,升天入地求之遍。
上穷碧落下黄泉,两处茫茫皆不见。
忽闻海上有仙山,山在虚无缥缈间。
楼阁玲珑五云起,其中绰约多仙子。
中有一人字太真,雪肤花貌参差是。
金阙西厢叩玉扃,转教小玉报双成。
闻道汉家天子使,九华帐里梦魂惊。
揽衣推枕起徘徊,珠箔银屏迤逦开。
云鬓半偏新睡觉,花冠不整下堂来。


1 类中的方法

1.1 实例方法

  • 实例方法描述的是对象的行为,声明在类型中,只能通过对象调用
  • 可以访问属性数据和对象数据
class Emperor:

    # 实例方法
    def find(self):
        print("两处茫茫皆不见")


li = Emperor()
li.find()  # 两处茫茫皆不见

1.2 类方法

  • 类方法是声明在类型中的方法,使用@classmethod 装饰
  • 类方法的第一个参数是当前类型cls(约定俗成使用cls,可以使用其他名称)
  • 类方法只能访问类型属性,不能访问实例属性
  • 可以通过类型名称对象引用直接调用
class Master:

    content = "为感君王辗转思,遂教方士殷勤觅。"

    @ classmethod
    def call(cls):
        print("临邛道士鸿都客,能以精诚致魂魄。", end="")
        # 获取类属性需要在前面加cls.
        print(cls.content)


# 类型名称调用
Master.call()  # 临邛道士鸿都客,能以精诚致魂魄。为感君王辗转思,遂教方士殷勤觅。
# 对象引用调用
master = Master
master.call()  # 临邛道士鸿都客,能以精诚致魂魄。为感君王辗转思,遂教方士殷勤觅。

1.3 静态方法

  • 类型中的普通函数,使用@staticmethod 装饰器声明
  • 不能访问实例属性,不能访问类型属性
class Master:

    @ staticmethod
    def find():
        print("为感君王辗转思,遂教方士殷勤觅")


Master.find()  # 为感君王辗转思,遂教方士殷勤觅

1.3 访问范围(边界判断)

方法名称 实例方法 类方法 静态方法
实例属性数据
类属性数据
局部变量数据

2 反射操作

  • 反射是在程序运行过程中,动态的从内存中获取执行状态,根据执行状态动态调用执行,完成具体功能的操作
  • 反射不直接操作对象数据,而是通过字符串的对象描述,交给运行中的程序,程序在运行时获取到字符串描述的对象数据,再去执行对象数据的操作,类比eval()函数
  • 反射可用于调试或容错开发(不确定目标对象是否已经完善了对应的函数/方法,但可以直接调用执行并且保证程序不能出错)

反射方法(内建函数):

  • hasattr(obj, name) 查询对象 obj 中是否有属性 name
  • getattr(obj, name) 获得对象 obj 中属性 name
  • setattr(obj, name, value) 设置对象 obj 中属性 name
  • delattr(obj, name) 删除对象 obj 中属性 name
class Emperor:

    def __init__(self, name):
        self.name = name

    def search(self, obj):
        # 用反射判断是否存在对应的方法,输出不同结果
        # 查询属性
        if hasattr(obj, "like"):
            # 获取属性
            res = getattr(obj, "like")
            return res()
        else:
            print("排空驭气奔如电,升天入地求之遍。上穷碧落下黄泉,两处茫茫皆不见。")


class Consort:

    def __init__(self, name):
        self.name = name

    def like(self):
        print("楼阁玲珑五云起,其中绰约多仙子。中有一人字太真,雪肤花貌参差是。")


class Person:
    pass


# 创建对象
li = Emperor("李隆基")
yang = Consort("杨玉环")
per = Person()

# 根据反射条件返回结果
li.search(per)  # 排空驭气奔如电,升天入地求之遍。上穷碧落下黄泉,两处茫茫皆不见。
li.search(yang)  # 楼阁玲珑五云起,其中绰约多仙子。中有一人字太真,雪肤花貌参差是。

# 修改
setattr(li, "name", "唐玄宗")
print(li.name)  # 唐玄宗

# 新增(不推荐在类型定义外新增属性)
setattr(li, "age", 52)
print(li.age)  # 52

# 删除
delattr(li, "age")
print(li.age)  # 报错  'Emperor' object has no attribute 'age'

3 单例模式

3.1 设计模式

  • 又称软件设计模式
  • 是一套被反复使用、经过分类编目的代码设计经验总结
  • 可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性
  • 成熟设计模式有20多种

3.2 单例模式

  • 单例模式是设计模式中创建型模式的一种
  • 指项目中某些数据,只能出现一次(如某个类只能能有一个实例)
class Emperor:

    _emperor = None

    def __new__(cls, *args, **kwargs):
        if not cls._emperor:
            cls._emperor = object.__new__(cls)  # 不存在则创建
        return cls._emperor

    def __init__(self, name):  # 每次执行创建初始化仍然回执行,但都是同一个对象
        self.name = name


emp1 = Emperor("李隆基")
print(emp1.name)  # 李隆基
emp2 = Emperor("唐玄宗")
print(emp2.name)  # 唐玄宗
emp3 = Emperor("唐明皇")
print(emp3.name)  # 唐明皇

# 虽然有三个引用变量,但是id是一样的,即始终是同一个对象
print(id(emp1), id(emp2), id(emp3))  # 2178250177224 2178250177224 2178250177224
# 打印出来都是最后一次修改的属性
print(emp1.name, emp2.name, emp3.name)  # 唐明皇 唐明皇 唐明皇

如果只需执行一次初始化:

class Emperor:

    _emperor = None

    # 是否已经初始化的标记
    init_note = False

    def __new__(cls, *args, **kwargs):
        if not cls._emperor:
            cls._emperor = object.__new__(cls)  # 不存在则创建
        return cls._emperor

    def __init__(self, name):
        # 判断是否已经初始化,如果已经未初始化则进行初始化
        if Emperor.init_note is False:
            self.name = name
            # 初始化后修改标记
            Emperor.init_note = True
        # 如果已经初始化则不执行初始化并直接返回
        else:
            return


emp1 = Emperor("李隆基")
print(emp1.name)  # 李隆基
emp2 = Emperor("唐玄宗")
print(emp2.name)  # 唐玄宗
emp3 = Emperor("唐明皇")
print(emp3.name)  # 唐明皇

# 只有第一次创建对象时初始化
print(emp1.name, emp2.name, emp3.name)  # 李隆基 李隆基 李隆基
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_46070898/article/details/105982538

智能推荐

字符串排序_在线字符串排序-程序员宅基地

文章浏览阅读222次。字符串排序题目描述先输入你要输入的字符串的个数。然后换行输入该组字符串。每个字符串以回车结束,每个字符串少于一百个字符。 如果在输入过程中输入的一个字符串为“stop”,也结束输入。 然后将这输入的该组字符串按每个字符串的长度,由小到大排序,按排序结果输出字符串。输入描述:字符串的个数,以及该组字符串。每个字符串以‘\n’结束。如果输入字符串为“stop”,也结束输入.输出描述:可能有多组测试数据,对于每组数据,将输入的所有字符串按长度由小到大排序输出(如果有“stop”,不输出“stop”)_在线字符串排序

chrome的network看不到接口请求_network无接口被调用-程序员宅基地

文章浏览阅读6.6k次。图中的几项都点击放开刷新页面就可以了。_network无接口被调用

win7 .net加解密模块出错,System.Reflection.TargetInvocationException_"u8在win7下运行出现处理配置失败,异常为\" system . reflection . ta-程序员宅基地

文章浏览阅读5.7k次。System.Reflection.TargetInvocationException,This implementation is not part of the windows platform FIPS validated......解决方法: 打开注册表,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\F_"u8在win7下运行出现处理配置失败,异常为\" system . reflection . targetinvoc"

Web前端html标签_web前端标签页-程序员宅基地

文章浏览阅读1.9k次。1.第一批6个。 用于标题醒目标签h1-h6,有上下行距 可以换行.注意:不能互相嵌套,属于行级标签 div:页面中的块,只有换行效果。注意:可以嵌套任何标签p:页面中的段落,有上下行距。注意:标签虽然是块级元素,但是它只能包含内联元素,不能包含块级元素,也不能包含另一个<p> 标签 span:隔离标签,没有任何样式。但是它很有用。 br:换行,没有结束标签。 hr:水平分割线,没有结束标签。 hr和br等标签有特殊写法,不需要按..._web前端标签页

matlab非线性传函,simulink2.ppt-动态系统仿真——Simulink.ppt-程序员宅基地

文章浏览阅读511次。simulink2.ppt-动态系统仿真——Simulink.ppt动态系统仿真——Simulink 主讲人:鲍文 目录 发展历史 基本使用 模型介绍 数值仿真 高级分析 例题 一、发展历史 1、动态系统仿真 CSCAD(E) 80年代前:自己编程序,C/FORTRAN 90年代后:集成仿真环境 VisSim ..._非线性系统的 传递函数

严重: Servlet.service() for servlet jsp threw exception_servlet.service() for servlet (jsp)whrow exception-程序员宅基地

文章浏览阅读870次。求大神相助,本人新手一枚,以前一直用Eclipse想转Idea,结果把项目从svn拉下来,Tomcat运行项目页面一直报500错误,日志如下严重: Servlet.service() for servlet jsp threw exception at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java..._servlet.service() for servlet (jsp)whrow exception

随便推点

《我去》——歌手:熊熊作业-程序员宅基地

文章浏览阅读892次。在清晨的八点,走出小区的大门,热气腾腾的市场,毫无规矩的车辆,一脸蜡像的人群,空气中隐藏的愿望,从未被提起的那些故事,那即将失去的时间,即将开始的生活,这个世界变得越难越难理解,如同城里开始变得越来越不如郊区,道路越修越堵,人们却越来越喜欢买车,写字楼盖得越来越多,却还是很难找到工作,淘宝上的二手货竟然会比新货的价格还高,而5块钱的汽油继08年之后竟然真的再次出现了,坐火车基本上..._熊熊作业我去

100G 数据,只有 100M 内存,怎么排序?_java一个 g 数字文件,100m 内存,排序-程序员宅基地

文章浏览阅读4.7k次。100G 数据,按照 100M 内存拆分,然后排序有序的数据,然后写入到 file1,file2…file100。多路归并。第一回合:从 file1,file2,file3……file100.取出第一个数。及最小的。所有的初始指针都是第一行。min1=min(min1=min(fil1,file2,file3……file100);file2,file3……file100);min1 写入..._java一个 g 数字文件,100m 内存,排序

@ConditionalOnClass和@ConditionalOnMissingClass的神秘探索-程序员宅基地

文章浏览阅读7.7k次,点赞4次,收藏11次。疑问为什么打开部分字节码文件(.class)文件,看到部分类报红,找不到该类,难道真的没有该类?那编译的时候不报错吗?Spring在启动的时候为什么会可以正常启动,没有该类还会正常启动,Spring是如何加载和处理这些类的呢?项目启动后,该类会被JVM加载初始化吗?疑点分析这里我随便找了一个类,里面包含一些没有的class,见下图发现字节码文件(RxReactiveStreams.class)不存在,那我在另外一个比较完整的项目,找到该类属于[rxjava-reactive-s_@conditionalonmissingclass

tightvnc,tightvnc软件介绍,详细介绍-程序员宅基地

文章浏览阅读6.8k次。tightvnc一款用于windows操作系统的应用软件,是一款远程控制软件。出门在外忘了带档案怎么办?FTP server 上头忘了开帐号怎么办?这些麻烦的问题其实都可以靠 VNC 解决。tightvnc的是一个免费的远程控制软件包。能让你轻松控制远程的计算机,就像坐在自己家的计算机前面一般,让你出门在外无后顾之忧!但是小编使用过一款也非常好的vnc工具,名字叫IIS7服务器管理工具。这个工具里面的VNC功能可以说是使用感非常棒的。它可以一键导出或导入,还可以一键批量打开VNC,还可以一键批量关闭VN

@Resource annotation requires a single-arg method-程序员宅基地

文章浏览阅读3.6k次。测试时出现这个报错:@Resource的位置写错了,或者多写了一个注解

IP-guard V4如何实现跨外网的部署?_ip-guard批量部署客户端的方法-程序员宅基地

文章浏览阅读1.4k次。如果企业内部需要同时管理下面N个分支机构的计算机,只要总部和分支机构都可以连上互联网便可以实现:首先需要IP-guard V3服务器的局域网有固定的公网IP地址或者有动态域名,在网关对IP-guard V3服务器的IP地址添加8237和8236、8235的TCP端口映射;添加完成后在IP-guard V3服务器创建客户端安装程序时在【服务器 IP/名称】栏输入固定的IP地址(或者动态域名),将打包成功的客户端安装程序提供给分支机构的计算机安装即可。说明:如果记录了文档备份、屏幕历史、邮件附件等数据量_ip-guard批量部署客户端的方法

推荐文章

热门文章

相关标签