一、封装

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

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

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

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. 14- Servlet.service() for servlet [mvc-dispatcher] in context with path [/collegeservice] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root caus

    有的service没有依赖注入:

  2. ajax原理以及优缺点(转)

    1.ajax技术的背景不可否认,ajax技术的流行得益于google的大力推广,正是由于google earth.google suggest以及gmail等对ajax技术的广泛应用,催生了ajax的 ...

  3. LUOGU P4408 [NOI2003]逃学的小孩(树的直径)

    题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚,他们决定在尽 ...

  4. sql转化为时间戳

    1.转化为时间戳 UNIX_TIMESTAMP():执行使用时间格式如:2009-08-06 10:10:40 .2009-08-06

  5. shell的基本语法

    一 赋值运算符 1 += :使用方法是,((x+=需要增加的数字))算和值. 2 *=  :使用方法是,((x*=需要怎加的倍数))算乘值. 3 %= :使用方法是,((x%=需要除以的数字))算余数 ...

  6. 2018.10.18 bzoj4105: [Thu Summer Camp 2015]平方运算(线段树)

    传送门 线段树妙题. 显然平方几次就会循环(打表证明不解释). 然后所有环长度的lcmlcmlcm不大于70. 因此维护一下当前区间中的节点是否全部在环上. 不是直接暴力到叶子节点修改. 否则整体打标 ...

  7. 2018.09.17 atcoder Digit Sum(数论)

    传送门 数论好题啊. 首先对于b<=sqrt(n)b<=sqrt(n)b<=sqrt(n)的情况直接枚举b判断一下就行了. 下面谈一谈如何解决b>sqrt(n)b>sqr ...

  8. ThinkPHP5命令行 执行控制器下的某方法

    入口文件后加一个空格就行了 1,首先cd到站点目录public下,我的入口文件是默认的index.php,然后执行以下命令,, 2,php要加入环境变量,index.php后面加空格,然后是模块,控制 ...

  9. hdu-1128(数学问题,筛数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1128 思路:从0,开始,每次求一个数x的d(x),然后判断如果x没有标记,则说明x没有由任意一个d(i ...

  10. 【转】关于编译链接——gcc/g++

    添加运行时共享库目录 运行使用共享库的程序需要加载共享库(不同于G++ 编译时指定的链接库),添加共享库的步骤: 修改文件 /etc/ld.so.conf 添加共享库目录 运行 ldconfig 同步 ...