Python之私有属性、私有方法、装饰器及属性和类的命名规则

news2024/11/18 3:29:23

一、私有属性和私有方法(实现封装)

Python对于类的成员没有严格的访问控制限制,这与其他面向对象语言有区别。关于私有属性和私有方法,有如下要点:

  1. 通常我们约定,两个下划线开头的属性是私有的(private)。其他为公共的(public)。
  2. 类内部可以访问私有属性(方法)
  3. 类外部不能直接访问私有属性(方法)
  4. 类外部可以通过_类名__私有属性(方法)名”访问私有属性(方法)

⚠️【注】方法本质上也是属性!只不过是可以通过()执行而已。

所以,此处讲的私有属性和公有属性,也同时讲解了私有方法和公有方法的用法。

如下测试中,同时也包含了私有方法和公有方法的例子。

【测试】私有属性和公有属性使用测试

#测试私有属性、私有方法
class Employee:
  __company = "程序员" #私有.通过dir查到_Employee__company
​
  def __init__(self,name,age):
    self.name = name
    self.__age = age     #私有实例属性
​
  def say_company(self):
    print("我的公司是:",Employee.__company)     #类内部可以直接访问私有属性
    print(self.name,"的年龄是:",self.__age)
    self.__work()
​
  def __work(self): #私有实例方法,通过dir可查到_Employee__work
    print("工作!好好工作,好好赚钱,娶个媳妇!")
​
p1 = Employee("高淇",32)
print(p1.name)
print(dir(p1))       #
p1.say_company()
print(p1._Employee__age)   #通过这种方式可以直接访问到私有属性  。通过dir可以查到属性:_Employee__age
#print(p1.__age)      #直接访问私有属性,报错
#p1.__sleep()       #直接访问私有方法,报错

 执行结果:

高淇
['_Person__age', '_Person__leg_num', '_Person__sleep', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say_age']
腿的数目: 2
高淇 的年龄是: 18
睡觉
18

从打印的Person对象所有属性我们可以看出。私有属性__age在实际存储时是按照_Person__age这个属性来存储的。这也就是为什么我们不能直接使用__age而可以使用_Person__age的根本原因。

二、@property装饰器

@property可以将一个方法的调用方式变成“属性调用”。

@property主要用于帮助我们处理属性的读操作、写操作。对于某一个属性,我们可以直接通过:

emp1.salary = 30000

如上的操作读操作、写操作。但是,这种做法不安全。比如,我需要限制薪水必须为1-10000的数字。这时候,我们就需要通过使用装饰器@property来处理。

#测试@property
class Employee:
​
  def __init__(self,name,salary):
    self.name = name
    self.__salary = salary
​
  @property        #相当于salary属性的getter方法
  def salary(self):
    print("月薪为{0},年薪为{1}".format(self.__salary,(12*self.__salary)))
    return self.__salary;
​
  @salary.setter
  def salary(self,salary):  #相当于salary属性的setter方法
    if(0<salary<1000000):
      self.__salary = salary
    else:
      print("薪水录入错误!只能在0-1000000之间")
​
​
emp1 = Employee("高淇",100)
print(emp1.salary)
​
emp1.salary = -200

运行结果:

月薪为100,年薪为1200
100
月薪为100,年薪为1200
100
薪水录入错误!只能在0-1000000之间

三、属性和方法命名总结

  1. _xxx:保护成员,不能用from module import *导入,只有类对象和子类对象能访问这些成员。(⚠️讲完模块再看)
  2. __xxx__:系统定义的特殊成员
  3. __xxx: 类中的私有成员,只有类对象自己能访问,子类对象也不能访问。(但,在类外部可以通过对象名. _类名__xxx这种特殊方式访问。Python不存在严格意义的私有成员)

⚠️ 再次强调,方法和属性都遵循上面的规则。

四、类编码风格

  1. 类名首字母大写,多个单词之间采用驼峰原则。
  2. 实例名、模块名采用小写,多个单词之间采用下划线隔开
  3. 每个类,应紧跟“文档字符串”,说明这个类的作用
  4. 可以用空行组织代码,但不能滥用。在类中,使用一个空行隔开方法;模块中,使用两个空行隔开多个类

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

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

相关文章

Centos环境 使用docker 部署MySQL 8.X详细版本

文章目录 安装docker配置docker 阿里镜像加速阿里云容器镜像服务ACR配置镜像源 安装部署MySQL拉取MySQL镜像创建挂载文件测试部署部署MySQL进入容器将它的mysql配置同步给宿主机删除test1测试容器 正式部署MySQL查看正式部署的容器状态配置远程连接字符集以及关闭跳过密码验证等…

Aop详解

AOP简介 AOP是一种编程思想&#xff0c;就如同面向对象这种编程思想一样&#xff0c;是一种编程范式&#xff0c;用来指导开发者如何组织程序更好的运行 AOP&#xff08;面向切面编程&#xff09; 作用&#xff1a;在不改变原代码的前提下&#xff0c;为其增加功能。 连接点…

基于 Yeoman 脚手架技术构建前端项目的实践

NodeJ、CLI 基于 Yeoman 脚手架技术构建前端项目的实践 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details…

torch.optim.lr_scheduler.OneCycleLR 学习与理解

一、功能和参数 1.1、通过图像直观地理解 OneCycleLR 的过程&#xff1a; 补充&#xff1a; 生成该图像的代码&#xff1a; 来自&#xff1a;torch.optim.lr_scheduler.OneCycleLR用法_dxz_tust的博客-CSDN博客 import cv2 import torch.nn as nn import torch from torchv…

Nodejs二、内置模块

零、文章目录 Nodejs二、内置模块 1、fs 文件系统模块 &#xff08;1&#xff09;fs 文件系统模块是什么 fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性&#xff0c;用来满足用户对文件的操作需求。 fs.readFile() &#xff1a;用来读取指…

【深度学习-第2篇】CNN卷积神经网络30分钟入门!足够通俗易懂了吧(图解)

网络上有着很多关于CNN入门的教程&#xff0c;但是总还是觉得缺少足够简易、直观、全面的文章&#xff0c;能让人通读下来酣畅淋漓&#xff0c;将CNN概念尽收囊中。本篇文章就想尝试一下&#xff0c;真正地带小白同学们轻松入门。 这篇文章包含很多图片&#xff0c;为了花这些…

k8s-containerd容器运行时默认50G存储位置更换

containerd作为k8s主要的cri&#xff0c;它默认存储位置是使用的/根目录挂载的资源。当容器运行的越来越多&#xff0c;默认的50G不够使用了。有2种方法可以进行解决。 方式1、增加/根分区的磁盘空间。 方式2、修改containerd配置文件&#xff0c;修改默认配置为/home 这里我…

【汤4操作系统】深入理解信号量的使用-三大问题的变体

主要从生产者消费者、读写者、哲学家问题中的经典变体进行讲述&#xff0c;均使用伪代码实现 生产者消费者变体 顾客看作是生产出的产品&#xff0c;理发师看作是消费者&#xff0c;沙发有空位&#xff0c;顾客就进去&#xff0c;沙发有顾客&#xff0c;理发师就去理发 和生产者…

Redis客户端 - Jdies快速入门

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis客户端 - Jdies快速入门 | CoderMast编程桅杆Redis客户端 - Jdies快速入门 简介 Jedis is a Java client for Redis designed for performance and ease of use. Jedis是Redis 的 Java 客户端&#xff0c;专为性能和易…

Python中使用matplotlib绘制各类图表示例

折线图 折线图是一种用于表示数据随时间、变量或其他连续性变化的趋势的图表。通过在横轴上放置时间或如此类似的连续变量&#xff0c;可以在纵轴上放置数据点的值&#xff0c;从而捕捉到数据随时间发生的变化。折线图可以用于比较不同变量的趋势&#xff0c;轻松地发现不同的…

不写代码如果解决Jmeter跨线程组取参数值问题?

目录 前言 定义属性法 文件转接法 总结&#xff1a; 前言 如果你工作中已经在用jmeter做接口测试&#xff0c;或性能测试了&#xff0c;你可能会遇到一个麻烦。 那就是jmeter的变量值不能跨线程组传递。 看&#xff0c;官方就已经给出了解释&#xff1a; 这个不是jmeter的…

机器学习——识别足球和橄榄球

一、选题的背景 橄榄球起源于足球&#xff0c;二者即相似又有所区别。计算机技术发展至今&#xff0c;AI技术也有了极大的进步&#xff0c;通过机器学习不断的训练&#xff0c;AI对于足球和橄榄球的识别能力可以帮助人们对足球和橄榄球的分辨。机器学习是一种智能技术&#xff…

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql

文章目录 一、问题引入 二、问题分析 三、问题解决 ​四、总结 一、问题引入 今天是学习谷粒商城的第一天&#xff0c;既然是第一天&#xff0c;肯定就是先对项目先有个基本的了解&#xff0c;比如是项目所用到的技术栈&#xff0c;项目整体的架构等&#xff0c;还对分布…

操作系统闲谈09——内存管理算法

操作系统闲谈09——内存管理算法 Buddy伙伴系统 假设存在一段连续的页框&#xff0c;阴影部分表示已经被使用的页框&#xff0c;现在需要申请一个连续的5个页框。这个时候&#xff0c;在这段内存上不能找到连续的5个空闲的页框&#xff0c;就会去另一段内存上去寻找5个连续的页…

华为OD机试真题B卷 JavaScript 实现【乱序整数序列两数之和绝对值最小】,附详细解题思路

一、题目描述 给定一个随机的整数&#xff08;可能存在正整数和负整数&#xff09;数组 nums&#xff0c;请你在该数组中找出两个数&#xff0c;其和的绝对值(|nums[x]nums[y]|)为最小值&#xff0c;并返回这个两个数&#xff08;按从小到大返回&#xff09;以及绝对值。 每种…

Android 行业就业难! 我是否该负重前行~

不知从何时开始&#xff0c;互联网市场岗位开始以收缩趋势进行发展&#xff0c;使得不少互联网行业的从业者面临者工作难找的难题&#xff0c;对于我们开发人群来说很不友好。 以前可以靠着跳槽实现涨薪梦&#xff0c;而如今是能不动就不动&#xff0c;能稳住是最好。 为什么这…

Docker——安装MySQL

一、安装并拉取MySQL镜像 先把docker启动起来 systemctl restart docker systemctl status docker 安装MySQL docker search mysql拉取镜像&#xff0c; 如果拉取不成功或者显示超时&#xff0c;可以去配置加速镜像源。 二、查看本地镜像并启动MySQL 但是光有镜像没有把镜像…

Redis面试之数据类型及底层原理

废话不多说直接上类型 string&#xff08;字符串&#xff09; hash&#xff08;哈希&#xff09; list&#xff08;列表&#xff09; set&#xff08;集合&#xff09; zset&#xff08;有序集合&#xff09; stream&#xff08;流&#xff09; geospatial&#xff08;地…

CRM软件有哪些?这9款值得推荐

业内有一句流传已久的话&#xff1a;你的左手不知道你的右手在做什么。同一个企业内部&#xff0c;不同部门之间往往存在信息不同步&#xff0c;数据不对称的情况&#xff0c;比如销售和营销部门关于某个市场活动所带来的效果产生分歧。CRM软件的存在就可以解决这类问题。 在正…

实验4 Cache性能分析【计算机系统结构】

实验4 Cache性能分析【计算机系统结构】 前言推荐实验四 Cache性能分析1 实验目的2 实验平台3 实验内容和步骤3.1 Cache容量对不命中率的影响3.2 相联度对不命中率的影响3.3 Cache块大小对不命中率的影响3.4 替换算法对不命中率的影响 4 实验总结与心得5 请思考 最后 前言 202…