一、封装

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

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

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

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. 【Spring】Spring boot多数据源历险记

    一.问题描述 笔者根据需求在开发过程中,需要在原项目的基础上(单数据源),新增一个数据源C,根据C数据源来实现业务.至于为什么不新建一个项目,大概是因为这只是个小功能,访问量不大,不需要单独申请个服务 ...

  2. 类实现Parcelable接口在Intent中传递

    类实现了Parcelable接口就可以在Intent中传递   只要在类的定义中实现Parcelable接口 代码 package entity; import android.os.Parcel; ...

  3. linux-git服务搭建

    第一步,安装git: 源码安装参考:http://www.cnblogs.com/syuf/p/9151115.html 第二步,创建一个git用户,用来运行git服务: $ sudo adduser ...

  4. spring mvc leaning

    解读 web.xml文件 <servlet>-----配置前端控制器的servlet <servlet-name>springMVC</servlet-name> ...

  5. 2018.10.19 NOIP训练 桌子(快速幂优化dp)

    传送门 勉强算一道dp好题. 显然第kkk列和第k+nk+nk+n列放的棋子数是相同的. 因此只需要统计出前nnn列的选法数. 对于前mmm%nnn列,一共有(m−1)/n+1(m-1)/n+1(m− ...

  6. spring boot web项目在IDEA下热部署解决办法(四步搞定)

    最近在用spring boot 做一个web站点,修改了类.html.js等,刷新页面,没有生效,非要手动去make一下或者重启,大大降低了开发效率. 什么是热部署? 应用启动后会把编译好的Class ...

  7. 手动安装jar到maven

    mvn install:install-file -DgroupId=com.chinacloud.mir.common -DartifactId=one-aa-sdk -Dversion=1.0-S ...

  8. (二)swagger-springmvc

    如何入门 1. 我在 http://mvnrepository.com/ 上搜索 swagger-springmvc 2. 我找到一个具体版本 http://mvnrepository.com/art ...

  9. struts2从浅至深(五)上传与下载

    1.编写上传页面 2.编写动作方法 import java.io.File;import java.io.IOException; import javax.servlet.ServletContex ...

  10. python logging 实现的进程安全的文件回滚日志类

    python标准库中的logging模块在记录日志时经常会用到,但在实际使用发现它自带的用于本地日志回滚的类 logging.handlers.RotatingFileHandler 在多进程环境下会 ...