广义上面向对象的封装 :代码的保护,面向对象的思想本身就是一种
只让自己的对象能调用自己类中的方法
狭义上的封装 ——> 面向对象的三大特性之一
属性 和 方法都藏起来 不让你看见
"""
会用到私有的这个概念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. 02、python的基础-->占位符、while...else...、逻辑运算符

    1.%s.%d格式化输出程序(%占位符,s字符串,d数字) name = input('请输入姓名:') age = input('请输入年龄:') job = input('请输入工作:') hob ...

  2. VC2008中将CString转换成const char*的一种有效方法

    文章转载自http://blog.csdn.net/lanbing510/article/details/7425613 在Visual Studio 200X下,CString直接转换成const ...

  3. shell编程:命令替换的运用

    命令替换,有两种方式 方式一:`command` 方式二:$(command) user.sh 查找系统中所有的用户,并且输出 #!/bin/bash nginx=`netstat -tnlp | | ...

  4. Invoke-Obfuscation混淆ps文件绕过Windows_Defender

    前提 powershell只能针对win7之后的系统,之前的win操作系统默认没有安装powershell. 所在目录:C:\Windows\System32\WindowsPowerShell\v1 ...

  5. mid

    """ Cross Site Request Forgery Middleware. This module provides a middleware that imp ...

  6. LeetCode Array Easy 53. Maximum Subarray 个人解法 和分治思想的学习

    Description Given an integer array nums, find the contiguous subarray (containing at least one numbe ...

  7. Vim: Overwrite read-only file without quiting vim

    当你忘记以sudo命令使用vim编辑一个只读文件时,可以执行以下vim命令强制覆写该文件: :w !sudo tee % > /dev/null 命令太长,可在vimrc文件中做命令映射(映射为 ...

  8. springMVC+freemarker整合

    转自:http://angelbill3.iteye.com/blog/1980904 在springMVC的项目中,加入freemarker 1.首先导入springMVC-webmvc所需的JAR ...

  9. 3、Python 基础类型 -- List 列表类型

    2.更新列表:list.append() 3.删除列表元素 del 

  10. CSIC_716_20191225【HTML基础入门】

    HTTP协议 超文本传输协议HyperText Transfer Protocol 四大特性: 1.一次请求一次响应 2.基于TCP/IP协议,作用于应用层 3.无状态 4.无连接 数据格式: 1.请 ...