一、封装

广义上的封装: 属于一个类的静态和动态属性,总是出现在一个类中.

       使用的永远用类名或者对象名调用.

狭义上的封装:就是把变量和方法私有化,在类的外部以及子类中不能直接使用了 。

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封装的更多相关文章

  1. android入门——数据存储

    首先是SharedPreferences 用户偏好 package com.example.wkp.aboutdata; import android.content.Intent; import a ...

  2. 移动端自动化测试Appium 从入门到项目实战Python版☝☝☝

    移动端自动化测试Appium 从入门到项目实战Python版 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌)  说到APP自动化测试,Appium可是说是非常流 ...

  3. day 26面向对象 的封装 接口 抽象

    大纲分析 # 面向对象# 类 :一类具有相同属性和方法的事物 #类的定义:class #类中可以定义的方法种类: #普通方法 self 对象 #类方法 cls @classmethod 类/对象 #静 ...

  4. 7.26 面向对象_封装_property_接口

    封装 封装 就是隐藏内部实现细节, 将复杂的,丑陋的,隐私的细节隐藏到内部,对外提供简单的访问接口 为什么要封装 1.保证关键数据的安全性 2.对外部隐藏实现细节,隔离复杂度 什么时候应该封装 1.当 ...

  5. day22_7.26面向对象之封装(接口与抽象)

    一.封装. 封装就是将丑陋复杂的隐式的细节隐藏到内部,对外提供简单的使用接口. 对外隐藏内部实现细节,并提供访问的接口.对内使用self操作. 二.为什么要封装? 对于一个计算机来说,不可能不使用机箱 ...

  6. [C#] 简单的 Helper 封装 -- RegularExpressionHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. CSharpGL(26)在opengl中实现控件布局/渲染文字

    CSharpGL(26)在opengl中实现控件布局/渲染文字 效果图 如图所示,可以将文字.坐标轴固定在窗口的一角. 下载 CSharpGL已在GitHub开源,欢迎对OpenGL有兴趣的同学加入( ...

  8. C#开发微信门户及应用(36)--微信卡劵管理的封装操作

    前面几篇介绍了微信支付方面的内容,本篇继续微信接口的一些其他方面的内容:卡劵管理.卡劵管理是微信接口里面非常复杂的一个部分,里面的接口非常多,我花了不少时间对它进行了封装处理,重构优化等等工作,卡劵在 ...

  9. C#开发微信门户及应用(35)--微信支付之企业付款封装操作

    在前面几篇随笔,都是介绍微信支付及红包相关的内容,其实支付部分的内容还有很多,例如企业付款.公众号支付或刷卡支付.摇一摇红包.代金券等方面的内容,这些都是微信接口支持的内容,本篇继续微信支付这一主题, ...

随机推荐

  1. vsftp 500 OOPS: cannot change directory:/home/xyp

    1.在linux终端下输入: > setsebool ftpd_disable_trans 1 (*如果出现Could not change active booleans: Invalid b ...

  2. VMware安装centos虚拟机 通过NAT与主机互通并能上网

    1.关于centos虚拟机的安装,我这里就不详细说明了,网上有很多教程,默认你们已经安装好.       (我的环境是centos6.6 x86 最小安装版) 2.右键虚拟主机,选择设置选项. 3.在 ...

  3. Tortoise SVN 使用笔记

    最近一个项目,团队使用的是SVN来控制版本,所以顺便学习下SVN的知识.在Windows上,肯定是用图形化客户端Tortoise SVN在加速我们的工作. 首先,在一个准备用在工作目录的文件夹下,点击 ...

  4. Python打杂之路

    1.任务要落到纸上好记性不如烂笔头,再好的记性也不如写到纸上明确无误,写到纸上就不用担心会漏掉哪项工作.平时,我们总是在忙着一项工作的同时还惦记着下一项工作,把工作都记下后,我们就可以专注于一项工作, ...

  5. web服务器部署过程记录

    由于之前没有服务器部署经验,又选择了所有软件都是单独编译安装,遇到很多问题,解决之后还是学习到了很多新东西. 如今回过头来还是选择lnmp集成环境的部署方式比较方便快捷:https://lnmp.or ...

  6. jquery获取radio单选框的值

    1.获取原有单选框的值 var value=$("input[name='is_setting']:checked").val(); 2.获取重选后的单选框的值 <tr> ...

  7. 通过BeanShell获取UUID并将参数传递给Jmeter

    有些HTTPS请求报文的报文体中包含由客户端生成的UUID,在用Jmeter做接口自动化测试的时候,因为越过了客户端,直接向服务器端发送报文,所以,需要在Jmeter中通过beanshell获取UUI ...

  8. Java 8 Stream API

    Java 8 Stream API JDK8 中有两大最为重要的改变.第一个是 Lambda 式:另外 Stream API(java.util.stream.*) Stream 是 JDK8 中处理 ...

  9. KbmMW 4.5 发布

    We are happy to announce the release of kbmMW v. 4.50.00 Professional, Enterprise and CodeGear Editi ...

  10. 2018.08.28 集合堆栈机(模拟+STL)

    描述 中学数学里集合的元素往往是具体的数字,比如A = {1,2,3},B = {}(空集)等等.但是要特别注意,集合的元素也可以是另一个集合,比如说C = {{}},即说明C有且仅有一个元素--空集 ...