Python 面向对象(四)

2023-10-27

8. 类的成员描述符(属性)

  • 类的成员描述是为了在类中对类的成员属性进行相关操作而创建的一种方式
    • get:获取属性的操作
    • set:修改或添加属性操作
    • delete:删除属性的操作
  • 如果想使用类的额成员描述符,大概有三种方法
    • 使用类实现描述器
    • 使用属性修饰符
    • 使用property函数
      • property函数很简单
      • property(fget, fset, fdel, doc)
  • 无论哪种修饰符都是为了对成员属性进行相应的控制
    • 类的方式:适用多个类中的多个属性共用同一个描述符
    • property:适用当前类中使用,可以控制一个类中多个属性
    • 属性修饰符:适用于当前类中使用,控制一个类中的一个属性

9. 类的内置属性

    __dict__: 以字典的方式显示类的成员组成
    __doc__: 获取类的文档信息
    __name__: 获取类的名称,如果在模块中使用,获取模块的名称
    __bases__: 获取某个类的所有父类,以元组的方式显示
    
复制代码

10. 类的常用魔术方法

  • 魔术方法就是不需要人为调用的方法,基本是在特定的时间自动触发
  • 魔术方法的统一特征,方法名被前后各两个下划线包裹
  • 操作类
    • __init__:构造函数
    • __new__:对象实例化方法,此魔术方法较特殊,一般不需要使用
    • __call__:对象当函数使用的时候触发
    • __str__:当对象被当作字符串使用的时候
    • __repr__:返回字符串
  • 描述符相关
    • __set__
    • __get__
    • __delete__
  • 属性操作相关
    • __getattr__:访问一个不存在的属性时触发
    • __setattr__:对成员属性进行设置的时候触发
      • 参数:
        • self用来获取当前对象
        • 被设置的属性名称,以字符串形式出现
        • 需要对属性名称设置的值
      • 作用:进行属性设置的时候进行验证或者修改
      • 注意:在该方法中不能对属性进行赋值操作,否则死循环
  • 运算类相关魔术方法
    • __gt__:进行大于判断的时候触发的函数
      • 参数
        • self
        • 第二个参数是第二个对象
        • 返回值可以是任意值,推荐返回布尔值

11. 类和对象的三种方法

  • 实例方法
    • 需要实例化对象才能使用的方法,使用过程中可能需要截至对象的其他对象的方法完成
  • 静态方法
    • 不需要实例化,通过类直接访问
  • 类方法
    • 不需要实例化
# 属性案例
# 创建Student类,描述学生类
# 学生具有Student.name属性
# 但name格式并不统一
# 可以用增加一个函数,然后自动调用的方式,但很蠢
class Student():
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
        # 如果不想修改代码
        self.setName(name)
        
    # 介绍下自己
    def intro(self):
        print("Hai, my name is {0}".format(self.name))
        
    def setName(self, name):
        self.name = name.upper()
        
s1 = Student("RUO Chen", 19.8)
s2 = Student("michi stangle", 24.0)
s1.intro()
s2.intro()
复制代码
Hai, my name is RUO CHEN
Hai, my name is MICHI STANGLE
复制代码
# propertya 案例
# 定义一个Person类,具有name,age属性
# 对于任意输入的姓名,我们希望用大写方式保存
# 年龄,我们希望内部统一用整数保存
# x = property(fget, fset, fdel, doc)
class Person():
    '''
    这是一个人,一个高尚的人,一个脱离了低俗趣味的人
    他还他妈的有属性
    '''
    # 函数名称可以任意
    def fget(self):
        return self._name * 2
    
    def fset(self, name):
        # 所有输入的姓名以大写方式 保存
        self.name = name.upper()
    def fdel(self):
        self._name = "NoName"
        
    name = property(fget, fset, fdel, "对name进行操作")
复制代码
# 类的内置属性举例
print(Person.__dict__)
print(Person.__doc__)
print(Person.__name__)
# 元组形式显示所有的父类
print(Person.__bases__) 
复制代码
{'__module__': '__main__', '__doc__': '\n    这是一个人,一个高尚的人,一个脱离了低俗趣味的人\n    他还他妈的有属性\n    ', 'fget': <function Person.fget at 0x000001FBBD3AFBF8>, 'fset': <function Person.fset at 0x000001FBBD3AF9D8>, 'fdel': <function Person.fdel at 0x000001FBBD3AF8C8>, 'name': <property object at 0x000001FBBD3B7BD8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>}

    这是一个人,一个高尚的人,一个脱离了低俗趣味的人
    他还他妈的有属性
    
Person
(<class 'object'>,)
复制代码
# init 举例
class A():
    def __init__(self, name = 0):
        print("哈哈,我被调用了")
        
a = A()
复制代码
哈哈,我被调用了
复制代码
# __call__ 举例
class A():
    def __init__(self, name = 0):
        print("哈哈,我被调用了")
        
    def __call__(self):
        print("我被调用again")
        
a = A()
a()
复制代码
哈哈,我被调用了
我被调用again
复制代码
# __str__ 举例
class A():
    def __init__(self, name = 0):
        print("哈哈,我被调用了")
        
    def __call__(self):
        print("我被调用again")
        
    def __str__(self):
        return '666'
        
a = A()
print(a)
复制代码
哈哈,我被调用了
666
复制代码
# __getattr__
class A():
    name = "NoName"
    age = 18
    
    def __getattr__(self, name):
        print("没找到")
        print(name)
    

        
a = A()
print(a.name)
print(a.addr)
复制代码
NoName
没找到
addr
None
复制代码
# __setattr__ 案例
class Person():
    def __init__(self):
        pass
    
    def __setattr__(self, name, value):
        print("设置属性:{0}".format(name))
        # 下面语句会导致问题,死循环
        # self.name = value
        # 此种情况,为了避免死循环,规定统一调用父类魔法函数
        super().__setattr__(name, value)
p = Person()
print(p.__dict__)
p.age = 18
复制代码
{}
设置属性:age
复制代码
# __gt__

class Student():
    def __init__(self, name):
        self._name = name
        
    def __gt__(self, obj):
        print("哈哈,{0} 会比 {1} 大吗?".format(self, obj))
        return self._name > obj._name
    
stu1 = Student("one")
stu2 = Student("two")
print(stu1 > stu2)
复制代码
哈哈,<__main__.Student object at 0x000001C15772EB38> 会比 <__main__.Student object at 0x000001C15772E550> 大吗?
False
复制代码
# 三种方法的案例
class Person():
    # 实例方法
    def eat(self):
        print(self)
        print("Eating......")
    # 类方法
    # 类方法的第一个参数,一般命名为cls,区别于self
    @classmethod
    def play(cls):
        print(cls)
        print("Playing......")
        
    # 静态方法
    # 不需要用第一个参数表示自身或者类
    @staticmethod
    def say():
        print("Saying......")
        
yueyue = Person()

# 实例方法
yueyue.eat()
# 类方法
Person.play()
yueyue.play()
# 静态方法
Person.say()
yueyue.say()
复制代码
<__main__.Person object at 0x000001C157766710>
Eating......
<class '__main__.Person'>
Playing......
<class '__main__.Person'>
Playing......
Saying......
Saying......

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 面向对象(四) 的相关文章

随机推荐

  • Linux 系统适用范围

    Linux 内核最初只是由芬兰人林纳斯 托瓦兹 Linus Torvalds 在赫尔辛基大学上学时出于个人爱好而编写的 Linux 是一套免费使用和自由传播的类 Unix 操作系统 是一个基于 POSIX 和 UNIX 的多用户 多任务 支
  • 按月、日统计查询数据SQL、以及case when的使用 -- postgresql、MySQL

    目录 获取每月最新一条数据及case when的使用 以及其他 数据类型转换 分页 等使用 postgresql 根据月份分组 创建时间排序 获取排序后的第一条数据 即获取每月最新一条数据 postgresql 查询显示当前月往前12个月份
  • PHP生成word文档

  • 如何进行Linux系统管理和维护?

    首先 让我们先了解一下Linux系统管理的重要性 在现实世界中 Linux系统管理就像是掌握一门外语 如果你想在一个外国城市旅游时和当地人交流 你需要掌握一些基本的语言知识 同样地 如果你想管理好一个Linux系统 你需要掌握一些基本的系统
  • ThinkPHP5.1获取有赞推送信息

    Index php
  • 1.4编程基础之逻辑表达式与条件分支 01:判断数正负

    1 4编程基础之逻辑表达式与条件分支 01 判断数正负 总时间限制 1000ms 内存限制 65536kB 描述 给定一个整数N 判断其正负 输入 一个整数N 109 lt N lt 109 输出 如果N gt 0 输出positive 如
  • 202311读书笔记

    202311读书笔记 始于极限 女性主义往复书简 读书是为了看到从未了解过的世界 始于极限 女性主义往复书简 作者上野千鹤子 铃木凉美 在小伙伴的读书群里看到的这本书 女性必读自我认知的书 涉及恋爱 婚姻 工作 自由等12个主题 啊啊啊 这
  • SQL SERVER导入mdf和ldf文件最简便的方法

    有时候我们需要导入mdf和ldf文件进入SQL SERVER中 现在我介绍一种只要三行代码就能导入的方法 一 找到一个现有数据库右键点击 新建查询 二 加入如下代码 EXEC sp attach db dbname 一个新的数据库名字 fi
  • Java 数组

    Java 数组 定义 1 数组是个容器 堆中的一块空间 需要在堆中开辟一块空间new 2 数组可以同时存储同一类数据的多个数据 a 多个数据 b 同一类型 特点 1 可以存储多个数据 但只能是同一类型 2 数组创建完成后数组长度无法改变 3
  • MySQL安装_win10(超详细)

    前言 解压版 免安装版 mysql 8 0 22 一 MySQL下载 解压 MySQL官网下载地址 https downloads mysql com archives community 英文版 中文版 下载完成如图所示 解压后如图所示
  • IDEA编写快捷生成代码

    1 psvm 生成main方法 public static void main String args 2 sout 生成打印输出 System out println 3 abc sout 生成打印字符串 System out print
  • Kotlin中接口、抽象类、泛型、out(协变)、in(逆变)、reified关键字的详解

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到教程 一 Kotlin中接口的定义 Kotlin中接口定义 Kotlin规定所有的接口属性和函数实现都要使用override关键字 接口中 定
  • css实现透明背景渐变 linear-gradient

    css实现透明背景渐变 linear gradient html div class curtain div css curtain before display block width 100 height 32px background
  • MES案例整理

    以下内容全部从互联网收集得来 有些可能虽然是厂商的用户但不是MES的用户 有些可能并不能称为MES案例 仅供大家参考 欢迎大家修正和补充 如要转载 请注明来源于e works圆目球鱼的博客 以下排名不分先后 西门子 转载请注明出自http
  • 排序算法之 归并排序及时间复杂度分析

    排序算法之 冒泡排序及性能优化 时间复杂度 空间复杂度分析 排序算法之 简单选择排序及时间复杂度分析 排序算法之 直接插入排序及时间复杂度分析 排序算法之 希尔排序及时间复杂度分析 排序算法之 快速排序及时间复杂度分析 排序算法之 堆排序及
  • mysql自动修改字段名_mysql中利用sql语句修改字段名称,字段长度等操作

    1 修改字段的长度 语法 ALTER TABLE 表名 MODIFY COLUMN 字段名 数据类型 修改后的长度 例子 将字段的长度由10改为20 ALTER TABLE attence MODIFY COLUMN id INT 20 2
  • VSCode 删除当前行快捷键

    ctrl shift k
  • 压缩感知(CompressedSensing)网络资源总结与分享(MatlabCode)

    即将硕士毕业 回首三年研究生 收获还是挺多的 感谢我的家人 朋友 导师以及实验室的各位 现将积累的一些网络上的资源进行总结与分享 其中主要为压缩感知 Compressed Sensing 稀疏表示 Sparse Representation
  • golang六个常用的web 框架

    框架一直是敏捷开发中的利器 能让开发者很快的上手并做出应用 甚至有的时候 脱离了框架 一些开发者都不会写程序了 成长总不会一蹴而就 从写出程序获取成就感 再到精通框架 快速构造应用 当这些方面都得心应手的时候 可以尝试改造一些框架 或是自己
  • Python 面向对象(四)

    8 类的成员描述符 属性 类的成员描述是为了在类中对类的成员属性进行相关操作而创建的一种方式 get 获取属性的操作 set 修改或添加属性操作 delete 删除属性的操作 如果想使用类的额成员描述符 大概有三种方法 使用类实现描述器 使