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)编写满足所有外部依赖的测试可能很复杂 ...
随机推荐
- c 循环左移
char b[11] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'}; const int iShift = 4; for (int j = ...
- 进度3_家庭记账本App_Fragment使用SQLite实现简单存储及查询
AddFragment.java: package com.example.familybooks; import android.content.ContentValues; import andr ...
- 牛逼了,用Python破解wifi密码
Python真的是无所不能,原因就是因为Python有数目庞大的库,无数的现成的轮子,让你做很多很多应用都非常方便.wifi跟我们的生活息息相关,无处不在.今天从WiFi连接的原理,再结合代码为大家详 ...
- Java 容器使用中如何选择
Collection ├List │├LinkedList │├ArrayList │└Vector │└Stack ├Queue │├Deque │└LinkedList └Set ├Sort ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习:弹窗
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script> ...
- -mtime
大家在使用find命令中的mtime参数时候,会看到官方的解释如下: -mtime n File's data was last modified n*24 hours ...
- Json返回结果为null属性不显示解决
import java.io.IOException; import org.springframework.boot.autoconfigure.condition.ConditionalOnMis ...
- CI项目设计Redis队列
项目开发过程中需要设计提供可平衡的处理多个用户请求的队列. 需求: 当用户登录后,查看系统中已经登录的管理员队列,然后查看后台管理员的处理能力,如果已经不能处理新的请求,则把该管理员从处理队列中删除, ...
- PAT Advanced 1154 Vertex Coloring (25) [set,hash]
题目 A proper vertex coloring is a labeling of the graph's vertices with colors such that no two verti ...
- 使用pycharm遇到问题排查过程
一.安装Python 下载路径:https://www.python.org/downloads/ 二.配置环境变量 安装Python后,配置环境变量,将安装目录添加到Path中: 使用pycharm ...