类:属性方法的私有公有详解

 1 # -*- coding: UTF-8 -*-
 2 # 无论名称是self还是cls,类方法或实例方法都是把第一个参数默认成cls或self,即调用类或调用实例才能使用。
 3
 4 class JustCounter:
 5     publicCount = 0    # 公开属性
 6     __secretCount = 0  # 私有属性
 7     def count_secret(self):
 8         print self.__secretCount
 9     def count_public(self):
10         print self.publicCount
11     @staticmethod   #静态方法:实例和类都可以调用,因为没有实例和类作为参数引入,所以不能作用于实例或类本身。
12     def func_static():
13         print ‘func_static work‘
14     @staticmethod
15     def func_static2(args1,args2):
16         print ‘args1=‘,args1,‘args2=‘,args2
17     @classmethod    #类方法:将类本身作为参数引入,实例和类都可以调用,都可以访问类属性,不能访问实例属性
18     def func_class(cls):
19         cls.publicCount = 888
20         print ‘func_class work‘
21     def func(self):    #实例方法:将实例本身作为参数引入,仅实例可以调用,可以访问实例属性
22         self.publicCount = 999
23         print ‘func work‘
24
25     def __secret_func(self):    #私有方法
26         print "__secret_func work"
27
28 counter = JustCounter()
29 counter2= JustCounter()
30 print ‘-------对于类的公有属性赋值,所有实例共享此属性‘
31 JustCounter.publicCount = 3
32 counter.count_public()
33 counter2.count_public()
34 print ‘-------不允许直接访问私有属性,只能通过给定的方法‘
35 # counter.__secretCount 此句将报错
36 counter.count_secret() #通过给定方法访问
37 print ‘-------对于类的私有属性赋值,对实例无用‘
38 JustCounter.__secretCount = 4
39 counter.count_secret()
40 counter2.count_secret()
41 print ‘-------类方法‘
42 JustCounter.func_class() #或counter2.func_class()
43 counter.count_public()
44 counter2.count_public()
45 print ‘-------实例方法‘
46 counter.func()
47 counter.count_public()
48 counter2.count_public()
49 print ‘-------静态方法‘
50 counter.func_static()
51 JustCounter.func_static()
52 counter.func_static2(‘good‘,‘great‘)
53 print ‘-------由于上面‘实例方法’对实例公有属性赋值了一次,切断了此实例与类的联系‘
54 JustCounter.publicCount = 3.5
55 counter.count_public()
56 counter2.count_public()
57 print ‘-------私有方法,仅仅只能在类的定义的内部作为一个中间函数给其他函数调用,不能在外部使用‘
58 # counter.__secret_func() 此句将报错
59 print ‘-------使用特殊方法访问私有属性,访问私有方法‘
60 counter._JustCounter__secret_func()
61 counter._JustCounter__secretCount = 1010
62 print counter._JustCounter__secretCount

输出结果为

-------对于类的公有属性赋值,所有实例共享此属性
3
3
-------不允许直接访问私有属性,只能通过给定的方法
0
-------对于类的私有属性赋值,对实例无用
0
0
-------类方法
func_class work
888
888
-------实例方法
func work
999
888
-------静态方法
func_static work
func_static work
args1= good args2= great
-------由于上面‘实例方法’对实例公有属性赋值了一次,切断了此实例与类的联系
999
3.5
-------私有方法,仅仅只能在类的定义的内部作为一个中间函数给其他函数调用,不能在外部使用,以下将报错
-------使用特殊方法访问私有属性,访问私有方法
__secret_func work
1010

Process finished with exit code 0

1.公有属性

  类公有属性的高明之处就在于,可以通过修改类公有属性a,修改所有实例中的这个公有属性a,做到全局控制,而如果需要实例单独控制自己的公有属性a,就创建实例同名属性a,切断被类属性a的控制。

2.私有

  很多时候,为了数据相对安全或者某些方法安全,外部不可见,要将需要保护的属性或方法设置成私有属性或私有方法,并将它们嵌入到实例方法或类方法中,仅仅可以通过实例方法或类方法使用他们,保证必须按照我们给予的实例方法和类方法来使用,不允许非法操作。

3.注意事项

  虽然私有属性和私有方法一定意义上是安全的,但这也只是相对安全,仍然有办法访问

  java中有反射办法来访问和修改私有属性

  python中可以使用 object._className__attrName 访问私有属性,用object._className__func()访问私有方法

  因此,我们要理解,这里所谓的私有,是从一定程度上的安全,防止获取了对象的用户对用户进行误操作和保证封装性,防止其他程序员误操作等,而不是我们用来保证程序不被劫持数据的绝对安全,这个程度上,私有属性是必要而不可缺少的。

原文地址:https://www.cnblogs.com/DylanHooz/p/8436629.html

时间: 2024-10-12 20:47:31

类:属性方法的私有公有详解的相关文章

C# 类属性封装、字段的详解

今日敲代码时,突然感觉对类的属性封装.字段有点犯迷糊了..连基础的都不知道了,那敲的代码怎么能严谨高效的.果断拿起各种高级编程.大全啥的翻起来~~这不再把自己的理解写下来(定义都是直接抄书的),献给同样迷糊的小伙伴. 先说下类的成员,它分为数据成员和函数成员.数据成员,简单点可以理解成类的数据,包含了字段.常量(const).事件:函数成员,就是操作类中的数据,包含方法.属性.构造函数.终结器(析构函数).运算符.索引器.(就提一下,方便后面说下去,要都解释就偏题了)字段就是类里定义的变量,而属

【学习笔记】HTML5视频的属性、方法、事件介绍 详解

规划了一下学习路线 HTML5 -> CSS3  -> JS ->综合 7.31日开始,做好笔记做好记录 认真学习. HTMLVideoElement和HTMLAudioElement 均继承自HTMLMediaElement)所以音频文件和视频文件大多数都是一样的,除了标签名称 <video> <audio> HTML视频 大多数视频是通过插件(比如 Flash)来显示的.然而,并非所有浏览器都拥有同样的插件. HTML5 规定了一种通过 video 元素来包含

复习 模块 类 属性 方法 继承

什么是模块? 包 系统模块: 系统中有个sys模块 根据sys模块的path属性方法,可以获取模块的位置. import sys 当我们导入模块的时候,会从上面目录一次查找. 我们大部分模块都在 /usr/lib64/python2.*/ 目录下能够找到 比如: os模块 string模块 也可以自定义python的path(模块目录) 创建目录 将目录加入sys.path 查看: 另外一种方法,修改系统的环境变量: 执行使环境变量生效: 查看: 验证: 我们自己写的脚本都可以作为模块来使用:

【转】jquery ajax 方法及各参数详解

在使用jquery的时候,我们经常用到jquery中对ajax的封装,下面对ajax函数的各参数详细说明和讲解,以便更好的理解和使用 $.get(url, data, callback,type) 和 $.post(url, data, callback, type). 1. jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据 这个是jQuery 的底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等. $.ajax() 返回其创建的 XML

jquery ajax 方法及各参数详解

jquery ajax 方法及各参数详解 1.$.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数信息. 参数列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求方式 ("POST" 或 "GET"), 默认为 "GET".注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分

EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

EntityFramework Core 1.1方法理论详解 当我们利用EF Core查询数据库时如果我们不显式关闭变更追踪的话,此时实体是被追踪的,关于变更追踪我们下节再叙.就像我们之前在EF 6.x中讨论的那样,不建议手动关闭变更追踪,对于有些特殊情况下,关闭变更追踪可能会导致许多问题的发生. 实体状态 对于EF Core 1.1中依然有四种状态,有的人说不是有五种状态么,UnChanged.Added.Modified.Deleted.Detached.如果我们按照变更追踪来划分的话,实际

android之属性动画和布局动画详解

1.属性动画是什么不废话,不懂的可以百度一下参考郭霖大神的动画详解篇:这里仅仅提供一个demo说说用法,抛砖引玉,代码的注释写的已经很详细,不再多说废话,一下提供的是一个基础的demo,讲解的是objectAnimator的基础用法,如平移.旋转.缩放.渐变以及动画的集合:至于objectAnimator(必须的有set get方法)和valueAnimator的详细区别也可参考郭霖大神的动画详解篇 2.除此基本用法,还有估值器和插值器 (1)插值器:动画速率的变换,有点类似物理的加速度,就是该

5.Swift枚举|结构体|类|属性|方法|下标脚本|继承

1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum  Celebrity{  case DongXie,XiDu,Nandi,BeiGai }  // 从左到右对应0,1,2,3 enum CompassPoint { case North case South case East case West //enum中可以定义方法 func show(){ print(self) } } //定义enum 变量 var p = CompassPoint.Nor

Python学习之属性访问与描述符详解

在Python开发中,对于一个对象的属性访问,我们一般采用的是点(.)属性运算符进行操作.例如,有一个类实例对象 foo ,它有一个 name 属性,那便可以使用 foo.name 对此属性进行访问.一般而言,点(.)属性运算符比较直观,也是我们经常碰到的一种属性访问方式.然而,在点(.)属性运算符的背后却是别有洞天,值得我们对对象的属性访问进行探讨. 在进行对象属性访问的分析之前,我们需要先了解一下对象怎么表示其属性.为了便于说明,本文以新式类为例.有关新式类和旧式类的区别,大家可以查看Pyt