Day 26封装
一、封装
广义上的封装: 属于一个类的静态和动态属性,总是出现在一个类中.
使用的永远用类名或者对象名调用.
狭义上的封装:就是把变量和方法私有化,在类的外部以及子类中不能直接使用了 。
class A:
STATIC ='aaa'#静态变量
__S ='bbbb'#私有的静态变量
def wahaha(self):
print(A.__S)#_A__S 系统自动加了一个_A
print(A.STATIC) #打印静态变量
print(A.__dict__) #以字典的形式打印出来
print(A._A__S)# 在类的外面调用是有的变量.
a= A()
a.wahaha()
A.__B=("ccc") #在类的外部添加一个静态变量.(此变量不是私有变量)
print(A.__dict__)
# 打印结果
# {'__module__': '__main__', 'STATIC': 'aaa', '_A__S': 'bbbb', 'wahaha': <function A.wahaha at 0x0058D6A8>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>,
'__doc__': None, '__B': 'ccc'}
私有类能够在内部随意调用,但不建议在外部调用
class B:
def __init__(self,name,pwd):
self.name =name
self.__pwd =pwd #也可以创建对象的私有属性.
def qqxing(self):
self._a ="A" #_B__a
def get_pwd(self):
print(self.__pwd) # B._B__pwd
b= B('alex','alex1234')
b.qqxing()
print(b.name) #对象调用属性.
# print(b._B__pwd) #当在类外部的时候,外面不建议直接使用对象的私有属性
# b.get_pwd()
class C:
def __ppt(self): #私有的方法
print("ppt")
self.age =83
def open(self): #内部调用私有方法.
self.__ppt()
print("打开文件") c=C()
c._C__ppt() #也可以调用. 不建议在外面调用,要在内部调用.
c.open()# 通过open方法去调用内部私有方法.
私有的 静态变量 对象属性 动态方法
# 私有的变量 只能在类的内部定义和使用
#__变量
#在类的外部使用私有静态变量_类名__私有变量名.
class D:
__DDD ='ddd' #_D__DD
AAA='aaa'
class E(D):
def qqxing(self):
print(E.AAA)# 可以调用
print(E.__DDD) #不可以调用 e =E()
e.qqxing()
#私有的名字 不能被子类继承.
java
# private 私有的 -- __变量名
#protect 保护的 --__N/A
#public 公共的 --正常的变量
# 房间类:所有人 价格 面积
class Room :
def __init__(self,owner,price,length,width,height):
self.owner =owner
self.__price_single =price #单价 ,私有对象属性
self.__length =length #私有对象属性
self.__width =width #私有对象属性.
self.height =height def get_area(self):
return self.__length * self.__width
def get_price(self):
return self.__price_single * self.get_area()
alex =Room ('alex ',1000,2,1,0.3)
print(alex.get_area())
print(alex.get_price())
答案:
2
2000
Property
#属性
property #重要程度五颗星
classmethod #重要程度三颗星
staticmethod #重要程度一颗星
class Person:
def __init__(self,name,height,weight):
self.name =name
self.__height =height
self.__weight =weight
@property #将一根方法伪装成属性
def bmi(self):
return self.__weight / (self.__height**2)
wang =Person('王子',1.77,69)
print(wang.bmi)
classmethod
class Goods:
__discount = 0.8
def __init__(self,name,price):
self.name = name
self.__price = price @property
def price(self):
return self.__price*Goods.__discount @classmethod #讲一个普通方法装饰为一个类方法
def change_discount(cls,new_dis): # 类方法
cls.__discount = new_dis
Goods.change_discount(1) #类名调用 类方法 ①
cig = Goods('cigrette',20)
print(cig.price)
cig.change_discount(0.2)
print(cig.price)
# cig.change_discount(1) #对象名调用方法 ②
# print(cig.price)
#类方法是被@classmethod装饰的特殊方法
#被装饰之后,方法默认接收一个 类 作为参数
# 之后所有的操作都只能和 类中的静态变量相关 而不应该和对象相关
# 类名 和 对象名 都可以直接调用类方法
staticmethod
class Student:
def __init__(self,name):
self.name = name @staticmethod #装饰一个不需要self参数 也不需要cls参数的函数
def login(a,b,c): # 普通的函数
usr = input('username>>>')
pwd = input('password>>>')
if usr == 'alex' and pwd == '':
obj = Student(usr)
return obj
# 学生 login
# 用户名 密码 属性
ret = Student.login(1,2,3)
print(ret)
Day 26封装的更多相关文章
- android入门——数据存储
首先是SharedPreferences 用户偏好 package com.example.wkp.aboutdata; import android.content.Intent; import a ...
- 移动端自动化测试Appium 从入门到项目实战Python版☝☝☝
移动端自动化测试Appium 从入门到项目实战Python版 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 说到APP自动化测试,Appium可是说是非常流 ...
- day 26面向对象 的封装 接口 抽象
大纲分析 # 面向对象# 类 :一类具有相同属性和方法的事物 #类的定义:class #类中可以定义的方法种类: #普通方法 self 对象 #类方法 cls @classmethod 类/对象 #静 ...
- 7.26 面向对象_封装_property_接口
封装 封装 就是隐藏内部实现细节, 将复杂的,丑陋的,隐私的细节隐藏到内部,对外提供简单的访问接口 为什么要封装 1.保证关键数据的安全性 2.对外部隐藏实现细节,隔离复杂度 什么时候应该封装 1.当 ...
- day22_7.26面向对象之封装(接口与抽象)
一.封装. 封装就是将丑陋复杂的隐式的细节隐藏到内部,对外提供简单的使用接口. 对外隐藏内部实现细节,并提供访问的接口.对内使用self操作. 二.为什么要封装? 对于一个计算机来说,不可能不使用机箱 ...
- [C#] 简单的 Helper 封装 -- RegularExpressionHelper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- CSharpGL(26)在opengl中实现控件布局/渲染文字
CSharpGL(26)在opengl中实现控件布局/渲染文字 效果图 如图所示,可以将文字.坐标轴固定在窗口的一角. 下载 CSharpGL已在GitHub开源,欢迎对OpenGL有兴趣的同学加入( ...
- C#开发微信门户及应用(36)--微信卡劵管理的封装操作
前面几篇介绍了微信支付方面的内容,本篇继续微信接口的一些其他方面的内容:卡劵管理.卡劵管理是微信接口里面非常复杂的一个部分,里面的接口非常多,我花了不少时间对它进行了封装处理,重构优化等等工作,卡劵在 ...
- C#开发微信门户及应用(35)--微信支付之企业付款封装操作
在前面几篇随笔,都是介绍微信支付及红包相关的内容,其实支付部分的内容还有很多,例如企业付款.公众号支付或刷卡支付.摇一摇红包.代金券等方面的内容,这些都是微信接口支持的内容,本篇继续微信支付这一主题, ...
随机推荐
- 4-计算九位数以内各个位数字和为s的种类
/*假设我们当前要求的是100以内各位数之和和等于s的数有多少个,可以想到就是10以内各位数之和等于s的数的个数再加上10到100内的各位数之和等于s的个数.令dp[i][j]就代表10的j次方内各位 ...
- Vagrant WinNFSd
Vagrant WinNFSd Manage and adds support for NFS on Windows. Supported Platforms As of version 1.0.6 ...
- 常用C字符串函数
static void str_repalce(char *src,char *from,char *to) { char *p,*q; int lenFrom; int le ...
- Tomcat连接池配置
今日做了个小网站,数据量不大,但当发布到虚拟主机上之后,接连不断的遇到各种问题. 被折磨了数日后,在网上查了大量的相关资料,现总结如下. 一.项目在上传到远程服务器的过程中,有可能丢失文件,或文件内容 ...
- Check time of different search methods
https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...
- 高性能 js -- 无阻塞加载脚本
参考: <<高性能JavaScript>> Nicbolas C. Zakas 著 javascript代码的下载和执行过程会阻塞浏览器的其他进程, 比如页面的绘制, 遇到&l ...
- 2018.10.13 bzoj4008: [HNOI2015]亚瑟王(概率dp)
传送门 马上2点考初赛了,心里有点小紧张. 做道概率dp压压惊吧. 话说这题最开始想错了. 最开始的方法是考虑f[i][j]f[i][j]f[i][j]表示第iii轮出牌为jjj的概率. 然后用第ii ...
- 2018.07.03 HDU Rikka with Phi(线段树)
Rikka with Phi Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) P ...
- The class cn.itcast.web.common.util.UtilFuns specified in TLD for the function selffn:htmlNewline cannot be found: cn.itcast.web.common.util.UtilFuns
我的一个Util方法的包名更改了,运行时候报这个错误.找到tld文件,把包名重新改为我改的名字就好使了.
- OpenGL ES 光照模型之——环境光照(RenderMonkey测试)
概述及目录(版权所有,请勿转载 www.cnblogs.com/feng-sc/) 本文总结如何在RenderMonkey下做简单的OpenGL ES环境光光照模型测试. 主要包括如下内容: 1.使用 ...