day16-封装(私有静态属性、私有属性、私有方法、类方法、静态方法)
# 一:
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-封装(私有静态属性、私有属性、私有方法、类方法、静态方法)的更多相关文章
- Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())
Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分 ...
- JavaScript 公有 私有 静态属性和方法
1.公有属性和公有方法 这里的 name age 都是参数传递进去 可以在外面直接实例化调用. 2.私有属性和方法 私有的只能在函数内部使用 作用域的原因 3.静态属性和静态方法 这里我首先 创建 ...
- 007-Scala类的属性和对象私有字段实战详解
007-Scala类的属性和对象私有字段实战详解 Scala类的使用实战 变量里的类必须赋初值 def函数时如果没参数可不带括号 2.不需要加Public声明 getter与setter实战 gett ...
- Dream------scala--类的属性和对象私有字段实战详解
Scala类的属性和对象私有字段实战详解 一.类的属性 scala类的属性跟java有比较大的不同,需要注意的是对象的私有(private)字段 1.私有字段:字段必须初始化(当然即使不是私有字段也要 ...
- 面向对象~~类的成员: 私有成员,公有成员, 实例方法, 类方法, 静态方法, 属性(property), isinstance ,issubclass, 元类(type)
一 私有成员公有成员 公有成员: 在任何地方都能访问 私有成员: 只有在类的内部才能访问 类从加载时,只要遇到类中的私有成员,都会在私有成员前面加上_类名 二 实例方法 实例方法就是类的实例能够使用的 ...
- 面向对象银角大王补充2-self就是调用当前方法的对象-静态字段,公有属性-封装的理解-继承的理解,普通方法,静态方法
self是什么,就是一个函数,就是一个形式参数 4.self就是调用当前方法的对象 静态字段,公有属性 静态字段使用场景,每个对象中保存相同的东西时,可以使用静态字段,公有属性 5.封装的理解 类中封 ...
- [转] unix/linux下线程私有数据实现原理及使用方法
在维护每个线程的私有数据的时候,我们可能会想到分配一个保存线程数据的数组,用线程的ID作为数组的索引来实现访问,但是有一个问题是系统生成的线程 ID不能保证是一个小而连续的整数,并且用数组实现的时候 ...
- python的类的 静态属性 类方法 静态方法
一.静态属性 静态属性说的就是数据属性 1.定义一个房间的类,求下这个房间的面积 class Room: def __init__(self,name,ower,width,length,heigh) ...
- 无所不能的PowerMock,mock私有方法,静态方法,测试私有方法,final类
1.为什么要用mock 我的一本书的解释: (1)创建所需的DB数据可能需要很长时间,如:调用别的接口,模拟很多数据 (2)调用第三方API接口,测试很慢, (3)编写满足所有外部依赖的测试可能很复杂 ...
随机推荐
- Win10教育版VL版kms密钥激活
1.右键开始图标,或者win+x,选择Windows PowerShell(管理员): 2.依次执行下面的命令,分别表示安装win10教育版密钥,设置kms服务器,激活win10教育版: slmgr ...
- 使用Dom4j生成xml文件(utf-8编码)
xml文件内容: <?xml version="1.0" encoding="UTF-8"?> <result> <code> ...
- HTTPS(身披SSL协议的HTTP)
参考链接: HTTP 与 HTTPS 的区别 HTTPS科普扫盲帖 HTTPS小结 HTTP 和 HTTPS 区别 HTTP是明文传输未加密,安全性差,HTTPS(HTTP + SSL)数据传输是加密 ...
- F - Moving Points树状数组
题:https://codeforces.com/contest/1311/problem/F 题意:给定x轴上的点以及他们的速度v,只在x轴上运动,求最小的dis之和,注意,这里的时间是可随意的,比 ...
- 洛谷P1002 过河卒(动态规划)
题目描述 棋盘上 AA 点有一个过河卒,需要走到目标 BB 点.卒行走的规则:可以向下.或者向右.同时在棋盘上 CC 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为 ...
- ubuntu16.04 pcl安装教程
https://blog.csdn.net/zkj126521/article/details/80157351 https://blog.csdn.net/e_small/article/detai ...
- Linux--shell 计算时间差
参考:https://www.cnblogs.com/leixingzhi7/p/6281675.html starttime=`date +'%Y-%m-%d %H:%M:%S'` #执行程序 en ...
- 生成随机数(Random类)和获取用户输入(Scanner类)
生成指定范围内的随机数 Math.random() 生成随机数,随机数在0到1之间,类型是 double. public class randCase { public static void mai ...
- LeetCode——48. 旋转图像
给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转图像. 示例 1: 给定 m ...
- 题解 LOJ-6485 【LJJ学二项式定理】
题目 由于看到正解的单位根反演过于复杂 (也就是看不懂) 所以自己构造了一个算法,理论上这个算法应该还有成长的空间(可以变得普适性更强) 不知道和单位根反演有没有一样,就发表出来了 反正转载前记得要联 ...