首页 > 编程语言 >python面向对象-学习笔记(五、属性相关的补充)

python面向对象-学习笔记(五、属性相关的补充)

时间:2023-10-29 15:44:05浏览次数:45  
标签:__ .__ python age 笔记 面向对象 print self 属性

私有化属性

  • 注意

    • python并没有真正支持私有化,但是可以使用下划线完成伪私有的效果
    • 类属性(方法)和实例属性(方法)遵循相同的规则
  • 公有属性a

    • 在类的内部 可以访问
    • 在子类的内部 可以访问
    • 在模块其他地方
      • 类的属性 可以访问
      • 子类的属性 可以访问
      • 类的实例的属性 可以访问
      • 子类的实例的属性 可以访问
    • 模块外部
      • 通过import方式导入模块 可以访问
      • 通过from...import...方式导入模块 可以访问
  • 受保护属性_a (下划线a)

    • 在类的内部 可以访问
    • 在子类的内部 可以访问
    • 在模块其他地方
      • 类的属性 可以访问,但是有提示
      • 子类的属性 可以访问,但是有提示
      • 类的实例的属性 可以访问,但是有提示
      • 子类的实例的属性 可以访问,但是有提示
    • 模块外部
      • 通过import方式导入模块 可以访问,但是会提示
      • 通过from...import...方式导入模块 无法访问
  • 私有属性__a (双下划线a)

    • 在类的内部 可以访问
    • 在子类的内部 无法访问
    • 在模块其他地方
      • 类的属性 无法访问
      • 子类的属性 无法访问
      • 类的实例的属性 无法访问
      • 子类的实例的属性 无法访问
    • 模块外部
      • 通过import方式导入模块 可以访问
      • 通过from...import...方式导入模块 无法访问
  • 通过这个属性设置,可以让from...import...导包的时候可以被访问

    • all = ["a", "_a", "__a"]

私有属性的实现机制

  • 名字重整(Name Mangling)
    • 重改__a为另外一个名称
      • _类名__a
  • 目的
    • 防止外界直接访问
    • 防止被子类同名称属性覆盖
  • 应用场景
    • 数据保护
    • 数据过滤

只读属性

  • 概念
    • 一个属性(一般指实例属性),只能读取,不能写入
  • 应用场景
    • 有些属性,只限在内部根据不同场景进行修改,而对外界来说,只能读取,不能写入
    • 比如:电脑的网速,网络状态
  • 方式一
    • 方案
      • 全部隐藏
        • 私有化 (既不能读,也不能写)
      • 部分公开
        • 公开读的操作
    • 具体实现
      • 私有化: 通过"属性前置双下划线"实现
      • 部分公开
        • 通过公开的方法
        • 优化
          • 添加property装饰器
            • 作用
              • 将一些"属性的操作方法"关联到某一个属性中
            • 概念补充
              • 经典类,没有继承object(python2)
              • 新式类,继承object(python3默认继承object)
            • property介绍
只读属性的实现(通过公开的方法)
class Person:
    def __init__(self):
        self.__age = 18

    # 通过实例方法来模拟只读属性
    def getAge(self):
        return self.__age


p1 = Person()
print(p1.getAge())

image

只读属性的实现(优化)
class Person:
    def __init__(self):
        self.__age = 18

    # 主要作用就是,可以以使用属性的方式,来使用这个方法
    @property
    def age(self):
        return self.__age


p1 = Person()
print(p1.age)

p1.age = 666

image

property方法的使用
class Person:
    def __init__(self):
        self.__age = 18

    def get_age(self):
        return self.__age

    def set_age(self, value):
        self.__age = value

    age = property(get_age, set_age)


p = Person()
print(p.age)

p.age = 90
print(p.age)
print(p.__dict__)

image

property装饰器的使用
class Person:
    def __init__(self):
        self.__age = 18

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, value):
        self.__age = value


p = Person()
print(p.age)
p.age = 90
print(p.age)
print(p.__dict__)

image

__setattr__设置只读属性
class Person:
    # 当我们通过实例属性=值,给一个实例增加一个属性,或者说,修改一下属性值的时候,都会调用这个方法
    # 在这个方法内部,才会真正的把 这个属性以及对应的数据给存储到__dict__字典里面
    def __setattr__(self, key, value):
        print(key, value)
        if key == "age" and key in self.__dict__.keys():
            print("这个属性是只读属性,不能设置数据")
        else:
            self.__dict__[key] = value
            # # 会导致死循环
            # self.key = value


p1 = Person()
p1.age = 18
p1.name = "sz"
print(p1.age)
print(p1.__dict__)

p1.age = 999
print(p1.age)

image

内置特殊属性

  • 类属性
    • __dict__ 类的所有属性和方法
    • __bases__ 类的所有父类构成的元组(支持多继承)
    • __doc__ 类的文档字符串
    • __name__ 类的名字
    • __module__ 类所在的模块
  • 实例属性
    • __dict__ 实例的属性
    • __class__ 实例对应的类
系统内置属性
class Person:
    """
    这是一个人
    """
    age = 19

    def __init__(self):
        self.name = "sz"

    def run(self):
        print("run")


print(Person.__dict__)
print(Person.__bases__)
print(Person.__doc__)
print(Person.__name__)
print(Person.__module__)

p = Person()
print(p.__dict__)
print(p.__class__)

image


学习链接: 【Python】零基础入门 面向对象编程(强烈推荐)

标签:__,.__,python,age,笔记,面向对象,print,self,属性
From: https://www.cnblogs.com/amanzhj/p/17795940.html

相关文章

  • python面向对象-学习笔记(二、类&对象的属性)
    如何定义一个类?创建类的格式class类名: pass怎么通过类,创建出一个对象?创建类,并实例化对象classMoney:passone=Money()#打印类print(Money)#打印类的实例print(one)类的别名和打印类的名称classMoney:pass#打印类的名称print(Money.__na......
  • 学习笔记7
    苏格拉底挑战第四章并发编程一、知识点归纳(一)线程1.线程的原理2.线程的优点(1)线程创建和切换速度更快(2)线程的响应速度更快(3)线程更适合并行计算3.线程的缺点(1)由于地址空间共享,线程需要来自用户的明确同步。(2)许多库函数可能对线程不安全。(3)在单CPU系统......
  • Python 实现 xls 文件转 xlsx 的若干方法
    在Python中,可以采用pandas、pyexcel、win32com和xls2xlsx这四个模块,实现xls转xlsx格式。以Excel示例文件test_Excel.xls为例,具体内容如下图所示:  pandas 安装命令pipinstallpandas-ihttps://mirrors.aliyun.com/pypi/simple具体使用方法importpa......
  • 《Attention Is All You Need》阅读笔记
    论文标题《AttentionIsAllYouNeed》XXXIsAllYouNeed已经成一个梗了,现在出现了很多叫XXXIsAllYouNeed的文章,简直标题党啊,也不写方法,也不写结果,有点理解老师扣论文题目了。作者这个作者栏太夸张了。八个作者全部标星,均等贡献。甚至专门写了一段介绍每个人的工......
  • 学习笔记7
    第四章总结并行计算导论要求解某个问题,先要设计一种算法,描述如何一步步地解决问题,然后用计算机程序以串行指令流的形式实现该算法。在只有一个CPU的情况下,每次只能按顺序执行某算法的一个指令和步骤。但是,基于分治原则(如二又树查找和快速排序等)的算法经常表现出高度的并行性,......
  • Unity学习笔记--入门
    Unity引擎学习入门:Unity中的坐标系:左手坐标系(z轴正方向向里面)x轴:平行屏幕向右正方向y轴:平行屏幕向上正方向Z轴:垂直屏幕向内为正方向【补】openGL是右手坐标系DirectX是左手坐标系窗口:窗口布局Layout:Scene这里我们可以看见所有的场景内容。窗口上的工具栏:有关......
  • 《信息安全系统设计与实现》第八周学习笔记
    《信息安全系统设计与实现》第八周学习笔记第四章并发编程并行计算尝试使用多个执行并行算法的处理器更快速的解决问题顺序算法与并行算法顺序算法:所有步骤通过单个任务依次执行,每次执行一个步骤,当所有步骤执行完成时,算法结束。并行算法:cobegin-coend代码块来指定独立......
  • Python 模块:创建、导入和使用
    什么是模块?将模块视为代码库。模块是一个包含一组函数的文件,您想要在应用程序中包含这些函数。创建一个模块要创建一个模块,只需将要包含在其中的代码保存在扩展名为.py的文件中:示例:将以下代码保存在名为mymodule.py的文件中:defgreeting(name):print("Hello,"+name)......
  • win10 openocd通过vscode远程调试stm32的uboot--Apple的学习笔记
    一,前言我在uboot支持的cortex-M4内核启动流程分析--Apple的学习笔记中就说过了,我计划要单步调试uboot,但是我只有stlink,所以要基于openocd的gdb来调试,所以就做了尝试,花费约2天时间,虽然做了些无用功,专门还装了ubuntu18.04,且基于ubuntu还安装了openocd这些其实都无用的,但是就是这些过......
  • python循环迭代
    学习目标掌握for与while循环掌握continue,break,pass的区别核心知识循环中有3种常见的方式顺序:从上向下,顺序执行代码(从上往下执行)分支:根据条件判断,决定执行代码的分支(if/else)循环:让特定代码重复执行(for/while)for循环for可循环遍历的对象有字符串,列表,字典,集合,元组#......