# 一:
class P:
__age = 30 #私有静态属性
def __init__(self,name):
self.__name = name #私有属性:属性名前面加上双下划线是私有属性。 def get_name(self):
return self.__name def __func(self): #私有方法
print('私有方法')
p = P('alex')
# print(p.__name) #报错,在类的外面,不能使用这个方法来调用私有属性。
print(p._P__name) #alex, 私有属性使用 对象._类名__属性名 调用才可以。
print(p.get_name()) #alex,调用方法可以返回私有属性。
print(p._P__age) #30,私有静态属性也是通过 对象._类名__属性名 调用。
print(p._P__func()) #私有方法通过 对象._类名__方法名() 调用。 # 二:
# 私有概念的作用:1.保护属性,不让它在类的外面被调用或者修改。2.不想被子类继承。
#父类的私有静态属性、私有属性、私有方法无法被子类继承:
class Game:
__country = 'CHINA' #私有静态属性
def __init__(self,name): #私有属性
self.__name = name
def __aggr(self): #私有方法
print('攻击力是100')
class Son(Game):pass s = Son('alex')
print(s._Son__country) #报错
print(s._Son__name)#报错
print(s._Son__aggr())#报错 # 三: @property
#超市商品:
class Goods:
def __init__(self,name,price,add_price,discount):#商品名字、进货价、加价、折扣
self.name = name
self.__price = price
self.add_price = add_price
self.discount = discount
@property #此装饰器把方法伪装成属性。
def price(self):
return (self.__price + self.add_price)* self.discount g = Goods('苹果',5,3,0.8)
print(g.price) #6.4,调用方法就像调用属性一样,省略括号()。 # 四、私有属性的删改查:
# 4.1删除私有属性:对象的私有属性被删除之后,类的私有属性也被删除。
class Goods:
def __init__(self,name,price):
self.name = name
self.__price = price
@property
def price(self):
return self.__price #返回值self.__price等于price()
@price.deleter #上和下两个方法的方法名必须跟此处的price同名才可以删除私有属性。
def price(self):
del self.__price # self.__price等于apple.price
apple = Goods('苹果',5)
print(apple.price)
del apple.price #del触发上面的deleter,接着调用price方法来删除私有属性。
print(apple.price) #'Goods' object has no attribute '_Goods__price',说明对象的私有属性已经被删除。
print(apple._Goods__price)#'Goods' object has no attribute '_Goods__price',类的私有属性也被删除了。 # 4.2修改私有属性: 修改是共享的,对象的私有属性被修改之后,类的私有属性也会被修改。
class Goods:
def __init__(self,name,price):
self.name = name
self.__price = price
@property
def price(self):
return self.__price #返回值self.__price等于price
@price.setter #上和下两个方法的方法名必须跟此处的price同名才可以修改私有属性。
def price(self,new_price):
self.__price = new_price # self.__price等于apple.price apple = Goods('苹果',5)
print(apple.price) #
apple.price = 8 #方法伪装成属性,看起来像属性修改,然后把8传给new_price。此操作是修改,而不是单独赋值。
print(apple.price) #8,修改是共享的,所以对象的私有属性和类的私有属性都被修改为8。
print(apple._Goods__price)#8,类的私有属性被修改为8。 #4.3修改私有静态属性: 修改原理跟修改私有属性一样,但是需要依靠实例化对象。苹果的折扣修改了,导致所有商品的折扣都被修改了,这是不合理的。
class Goods:
__discount = 1 #私有静态属性
@property
def discount(self):
return Goods.__discount #Goods.__discount = discount
@discount.setter
def discount(self,new_discount):
Goods.__discount = new_discount #Goods.__discount = apple.discount apple = Goods()
print(apple.discount) #
apple.discount = 0.8
print(apple.discount) # 0.8
print(apple._Goods__discount) # 0.8,苹果的折扣修改了,导致所有商品的折扣都被修改了,这是不合理的。 #4.4 @classmethod类方法。商品的折扣修改了,苹果的折扣也随着被修改,这是合理的。
class Goods:
__discount = 0.8
def __init__(self,name,price):
self.name = name
self.__price = price #price是进货价,使用私有属性保护起来,不想在类的外面被修改。
@property
def price(self):
return self.__price * Goods.__discount # 售价=进货价*折扣
@classmethod #类方法可以修改私有静态属性,不需要依靠实例化对象apple。
def discount(cls,new_discount): #对象是cls,所以这个方法里面不能有私有属性,因为私有属性的对象是self。
cls.__discount = new_discount apple = Goods('apple',5)
print(apple.price) # 4.0
Goods.discount(0.7)
print(apple._Goods__discount) # 0.7
print(apple.price) # 3.5 # 五、静态方法:@staticmethod跟对象和类没关系,apple()括号里面没有self。
class Goods:
@staticmethod #静态方法
def apple():
print('苹果')
g = Goods()
g.apple() #苹果
Goods.apple()#苹果

day16-封装(私有静态属性、私有属性、私有方法、类方法、静态方法)的更多相关文章

  1. Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())

    Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分    ...

  2. JavaScript 公有 私有 静态属性和方法

    1.公有属性和公有方法 这里的 name  age  都是参数传递进去 可以在外面直接实例化调用. 2.私有属性和方法 私有的只能在函数内部使用 作用域的原因 3.静态属性和静态方法 这里我首先 创建 ...

  3. 007-Scala类的属性和对象私有字段实战详解

    007-Scala类的属性和对象私有字段实战详解 Scala类的使用实战 变量里的类必须赋初值 def函数时如果没参数可不带括号 2.不需要加Public声明 getter与setter实战 gett ...

  4. Dream------scala--类的属性和对象私有字段实战详解

    Scala类的属性和对象私有字段实战详解 一.类的属性 scala类的属性跟java有比较大的不同,需要注意的是对象的私有(private)字段 1.私有字段:字段必须初始化(当然即使不是私有字段也要 ...

  5. 面向对象~~类的成员: 私有成员,公有成员, 实例方法, 类方法, 静态方法, 属性(property), isinstance ,issubclass, 元类(type)

    一 私有成员公有成员 公有成员: 在任何地方都能访问 私有成员: 只有在类的内部才能访问 类从加载时,只要遇到类中的私有成员,都会在私有成员前面加上_类名 二 实例方法 实例方法就是类的实例能够使用的 ...

  6. 面向对象银角大王补充2-self就是调用当前方法的对象-静态字段,公有属性-封装的理解-继承的理解,普通方法,静态方法

    self是什么,就是一个函数,就是一个形式参数 4.self就是调用当前方法的对象 静态字段,公有属性 静态字段使用场景,每个对象中保存相同的东西时,可以使用静态字段,公有属性 5.封装的理解 类中封 ...

  7. [转] unix/linux下线程私有数据实现原理及使用方法

     在维护每个线程的私有数据的时候,我们可能会想到分配一个保存线程数据的数组,用线程的ID作为数组的索引来实现访问,但是有一个问题是系统生成的线程 ID不能保证是一个小而连续的整数,并且用数组实现的时候 ...

  8. python的类的 静态属性 类方法 静态方法

    一.静态属性 静态属性说的就是数据属性 1.定义一个房间的类,求下这个房间的面积 class Room: def __init__(self,name,ower,width,length,heigh) ...

  9. 无所不能的PowerMock,mock私有方法,静态方法,测试私有方法,final类

    1.为什么要用mock 我的一本书的解释: (1)创建所需的DB数据可能需要很长时间,如:调用别的接口,模拟很多数据 (2)调用第三方API接口,测试很慢, (3)编写满足所有外部依赖的测试可能很复杂 ...

随机推荐

  1. swiper用axios异步请求后 循环失效

    解决方案 使用ajax动态获取数据  当数据还没有收到的时候,swiper组件收到的是跟组件data传过来的空数组,会造成渲染问题 这个时候可以给swiper组件 设置一个  v-if='list.l ...

  2. FFmpeg命令大全(更新中)

    1.视频抽取音频: ffmpeg -i 3.mp4 -vn -y -acodec copy 3.aacffmpeg -i 3.mp4 -vn -y -acodec copy 3.m4a

  3. Arduino LiquidCrystal库函数中文对照

    我之所以会试试看LCD+Shield,一是因为我本来就有这块板,但一直不会用,第二个原因则是Arduino+Cookbook这本书.O’Reilly的这本手册对你在Arduino实践中的各种问题(几乎 ...

  4. Navicat for Mysql 11.2 的下载,安装与激活

    1. Navicat for Mysql 11.2 的下载 链接:https://pan.baidu.com/s/1w54F-MYTLuy4TQwpzUE7bQ       密码:zsfu 2.下载的 ...

  5. C# 串口编程,扫码枪使用

    一.串口通信简介 串行接口(串口)是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件.一般完成这种功能的电路,我们称为 ...

  6. 技术沙龙|京东云区块链进校园-京东云&深圳大学线下沙龙分享回顾

    在刚刚结束的京东云&深圳大学技术沙龙活动中,多位京东云的技术大咖针对京东云BDS产品技术细节.开源计划,与深圳大学的同学和参会者进行了深入探讨,干货满满反响深刻,获得了在场同学与参会者的一致好 ...

  7. Java学习十八

    学习内容: 1.Java集合 1.自定义的set类添加重复数据需要在实体类中添加hashcode和equals方法. 2.查找set对象信息(以宠物猫为例) //在集合中查找花花的信息并输出 if(s ...

  8. SQL的技巧

    衍生特征时, 统计每个类目id的用户的购买次数.金额, 用了下面语法, 发现效率很低. select UID , sum(if(item_level1_id='1', order_cnt, 0)) s ...

  9. 寒假day03-python

    今天完成了毕设登录注册.填报等功能的界面优化,同时总结了python网络课程的部分知识点 1.修改jupyter notebook默认路径:进入cmd:(1)cd /d F:\(2)jupyter n ...

  10. py02_03:py的数据类型

    数据类型初识 1. 整数(int) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值 ...