广义上面向对象的封装 :代码的保护,面向对象的思想本身就是一种
只让自己的对象能调用自己类中的方法
狭义上的封装 ——> 面向对象的三大特性之一
属性 和 方法都藏起来 不让你看见
"""
会用到私有的这个概念de场景
1.隐藏起一个属性 不想让类的外部调用
2.我想保护这个属性,不想让属性随意被改变
3.我想保护这个属性,不被子类继承
"""

应用场景

class Person:
__key = 123 # 私有静态属性
def __init__(self,name,passwd):
self.name = name
self.__passwd = passwd # 私有属性 def __get_pwd(self): # 私有方法
return self.__passwd #只要在类的内部使用私有属性,就会自动的带上_类名 def login(self): # 正常的方法调用私有的方法
self.__get_pwd() alex = Person('alex','alex3714')
print(alex._Person__passwd) # _类名__属性名
print(alex.get_pwd()) #这种会报错
print(alex._Person__get_pwd())
# 所有的私有 都是在变量的左边加上双下划綫
# 对象的私有属性
# 类中的私有方法
# 类中的静态私有属性
# 所有的私有的 都不能在类的外部使用

二、封装与扩展性:对象可以调用类方法和静态方法么? 可以 但一般情况下 推荐用类名调用

有一道题是这样的
class Room:
def __init__(self,name,length,width):
self.__name = name
self.__length = length
self.__width = width
def get_name(self):
return self.__name
def set_name(self,new_name):
if type(new_name) is str and new_name.isdigit()==False:
self.__name=new_name
else:
print('名字修改不合法')
def area_room(self):
return self.__length * self.__width
my_room=Room('my_room',100,100)
print(my_room.get_name()) #my_room
print(my_room.set_name('big_room')) #big_room
print(my_room.area_room()) #
1.property:
是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值,内置装饰器函数 只在面向对象中使用
先看一个简单一点的用法:
from math import pi
class Circle:
def __init__(self,r):
self.r = r
@property
def perimeter(self):
return 2*pi*self.r
@property
def area(self):
return self.r**2*pi c1 = Circle(5)
print(c1.area) # 圆的面积 #表明上可以省掉一个调用 的括号
print(c1.perimeter) # 圆的周长
如果用property装饰一下上面的例题,会怎么样呢?已然变成了进阶版
class Room:
def __init__(self,name,length,width):
self.__name = name
self.__length = length
self.__width = width
@property #在每个方法都装饰这个函数,那么在下面调用的时候就可以把方法伪装为属性调用啦
def name(self):
return self.__name @name.setter #这里为了实现对neme的修改,所以用name.setter这个装饰,并且方法名要和被修改的name保持一致
def name(self,new_name):
if type(new_name) is str and new_name.isdigit()==False: #判断修改的新名字是字符串并且不是数字,才能允许修改
self.__name=new_name #这里要修改的是私有属性name 所以要加上双下划线
else:
return '名字修改不合法'
@name.deleter #装饰删除name
def name(self):
del self.__name
@property #普通装饰作用
def area_room(self):
return self.__length * self.__width
my_room=Room('my_room',100,100)
print(my_room.name) #my_room
my_room.name='big_room'
print(my_room.area_room) #10000
print(my_room.name) #big_room
del my_room.name   #删除了,如果再打印my_room.name会报错的
#计算圆的周长和面积
from math import pi
class Circle:
def __init__(self,r):
self.c_r=r
@property
def perimeter(self):
return 2*self.c_r*pi
@property
def area(self):
return pi*self.c_r**2
circle_1=Circle(3)
print(circle_1.perimeter)
print(circle_1.area)
#计算体脂数
class Person:
def __init__(self,high,weigh):
self.high=high
self.weigh=weigh
@property
def BMI(self):
return self.weigh/self.high**2
zzy=Person(1.58,51)
print(zzy.BMI)

property练习

为什么要用property:
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,
这种特性的使用方式遵循了统一访问的原则
2.method 方法:
classmethod   类方法    ****   当方法操作值涉及静态属性,传cls  进行类的操作,而不是传self 就用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_discount): # 修改折扣 默认传cls
cls.__discount = new_discount
apple = Goods('苹果',5)
print(apple.price)
Goods.change_discount(0.5) # Goods.change_discount(Goods)
apple.change_discount(0.7) #3.5不推荐使用对象调用
print(apple.price)
# 当这个方法的操作只涉及静态属性的时候 就应该使用classmethod来装饰这个方法
staticmethod  静态的方法 *** 
:在完全面向对象的程序中,
如果一个函数 既和对象没有关系 也和类没有关系 那么就用staticmethod将这个函数变成一个静态方法
当想写纯面向对象中写一个和类和对象无关的函数时候,不想默认传self 这时候用staticmethod
class Staticmethod_Demo():
role = 'dog' @staticmethod
def func(): #()里面可以任意写参数,不用默认写self
print("当普通方法用") Staticmethod_Demo.func()
staticmethod练习

三、小结

# 类方法和静态方法 都是类调用的
# 对象可以调用类方法和静态方法么? 可以 但一般情况下 推荐用类名调用
# 类方法 有一个默认参数 cls 代表这个类 cls
# 静态方法 没有默认的参数 就象函数一样
												

python--面向对象:封装的更多相关文章

  1. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

  2. python面向对象封装案例(附:is和==的区别)

    面向对象封装案例 目标 封装 小明爱跑步 存放家具 01. 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对 ...

  3. python面向对象-封装-property-接口-抽象-鸭子类型-03

    封装 什么是封装: # 将复杂的丑陋的隐私的细节隐藏到内部,对外提供简单的使用接口 或 # 对外隐藏内部实现细节,并提供访问的接口 为什么需要封装 1.为了保证关键数据的安全性 2.对外部隐藏内部的实 ...

  4. Python—面向对象 封装03

    接着上面的一篇继续往下: 如何隐藏 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) class A: __x = 1 # _A__x = 1 def __init__(self, ...

  5. Python面向对象封装案例

    01. 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对象,然后 让对象调用方法 对象方法的细节 都被 封装 ...

  6. python面向对象封装案例2

    封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对象,然后 让对象调用方法 对象方法的细节 都被 封装 在 类 ...

  7. python面向对象(封装、多态、反射)

    目录 面向对象之封装 @property 面向对象之多态 面向对象之反射 面向对象之封装 含义 将类中的某些名字按照特殊的书写方式"隐藏"起来,不让外界直接调用,目的是为了不然外界 ...

  8. python面向对象-封装and多态

    python 接口类和抽象类 为什么讲封装之前要将这个东西? 我才不会说为什么 首先: python没有接口类这个概念!!!!!!!! 哈哈哈......神经病 python抽象类和接口类更接近于一种 ...

  9. Python面向对象----封装

    1. Python语言不是强类型语言, 公有和私有体现的不是很明显.私有成员可以通过 对象._ClassName__私有成员进行访问 2. 使用封装借助了装饰器 其实具有类get和set等操作

  10. python 面向对象 封装

    什么是封装 广义上的封装:代码的保护,面对对象的思想本身就是 只让自己的对象能调自己类的方法 狭义上的封装:将属性和方法藏起来 私有属性/私有方法 python没有真正意义的私有属性,可以通过调用实例 ...

随机推荐

  1. java jpa 实体关联

    关联关系: 1. One to One 2. One to Many 3. Many to One 4 Many to Many 映射: 延迟加载 @Basic(fetch = FetchType.L ...

  2. ionic node-sass安装或编译失败:MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”

    错误原因:缺少windows构建插件 解决方法:npm install --global --production windows-build-tools  (如果目录在C盘下,需要管理员权限运行,全 ...

  3. java全栈商业小程序开发

    此次开发只为学习和巩固,第一次学习开发 一.开发前需要了解: 开发框架MVVM.痛点.开源工具.VUE前端框架.微信支付模块.uni-app前端框架.小程序申请.开发工具下载.编写测试小程序.小程序结 ...

  4. linux - sftp, scp, rz, sz(文件传输命令)

    1. sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具.由于它是基于SSH的,会在传输过程中对用户的密码.数据等敏感信息进行加密,因此可以有效的防止用户信息在传输的过程中被窃 ...

  5. zabbix生产环境案例(三)

    生产环境案例(三) 链接:https://pan.baidu.com/s/1q5YwJMTcZLcS5OQ0iOu44A 提取码:8gdi 复制这段内容后打开百度网盘手机App,操作更方便哦 1. Z ...

  6. linux子网掩码优化配置

    prefix prefix是前缀的意思,这里指子网掩码的位数. 如255.255.255.0则在ifcfg-eth0的配置文件中:PREFIX=24而NETMASK与PREFIX的作用是一样的,都是配 ...

  7. 【JS学习】慕课网8-17编程练习 网页的返回与跳转

    编程练习 制作一个跳转提示页面: 要求: 1. 如果打开该页面后,如果不做任何操作则5秒后自动跳转到一个新的地址,如慕课网主页. 2. 如果点击“返回”按钮则返回前一个页面. 代码如下: 需要注意的是 ...

  8. (二)Django连接本地mysql异常

    Pycharm连接数据库出现错误 管理员身份进入mysql数据库 命令: mysql -u root -p 重新进入mysql 在进入Pycharm发现连接成功

  9. python 对redis key的基本操作

    首先看一下Python 操作redis.StrictRedis 的初始化方法__init__ def __init__(self, host='localhost', port=6379, db=0, ...

  10. 转译es6原生原生对象及方法,如Object.assign,Object.keys等,及promise

    下面主要为兼容恶心的ie 1,首先引入‘babel-polyfill’,可写在webpack.dev.js的entry.vendors数组里面 2,在入口文件如app.js里面import 'babe ...