python--面向对象:封装
广义上面向对象的封装 :代码的保护,面向对象的思想本身就是一种
只让自己的对象能调用自己类中的方法
狭义上的封装 ——> 面向对象的三大特性之一
属性 和 方法都藏起来 不让你看见
"""
会用到私有的这个概念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()
三、小结
# 类方法和静态方法 都是类调用的
# 对象可以调用类方法和静态方法么? 可以 但一般情况下 推荐用类名调用
# 类方法 有一个默认参数 cls 代表这个类 cls
# 静态方法 没有默认的参数 就象函数一样
python--面向对象:封装的更多相关文章
- python面向对象(封装,继承,多态)
python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...
- python面向对象封装案例(附:is和==的区别)
面向对象封装案例 目标 封装 小明爱跑步 存放家具 01. 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对 ...
- python面向对象-封装-property-接口-抽象-鸭子类型-03
封装 什么是封装: # 将复杂的丑陋的隐私的细节隐藏到内部,对外提供简单的使用接口 或 # 对外隐藏内部实现细节,并提供访问的接口 为什么需要封装 1.为了保证关键数据的安全性 2.对外部隐藏内部的实 ...
- Python—面向对象 封装03
接着上面的一篇继续往下: 如何隐藏 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) class A: __x = 1 # _A__x = 1 def __init__(self, ...
- Python面向对象封装案例
01. 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对象,然后 让对象调用方法 对象方法的细节 都被 封装 ...
- python面向对象封装案例2
封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对象,然后 让对象调用方法 对象方法的细节 都被 封装 在 类 ...
- python面向对象(封装、多态、反射)
目录 面向对象之封装 @property 面向对象之多态 面向对象之反射 面向对象之封装 含义 将类中的某些名字按照特殊的书写方式"隐藏"起来,不让外界直接调用,目的是为了不然外界 ...
- python面向对象-封装and多态
python 接口类和抽象类 为什么讲封装之前要将这个东西? 我才不会说为什么 首先: python没有接口类这个概念!!!!!!!! 哈哈哈......神经病 python抽象类和接口类更接近于一种 ...
- Python面向对象----封装
1. Python语言不是强类型语言, 公有和私有体现的不是很明显.私有成员可以通过 对象._ClassName__私有成员进行访问 2. 使用封装借助了装饰器 其实具有类get和set等操作
- python 面向对象 封装
什么是封装 广义上的封装:代码的保护,面对对象的思想本身就是 只让自己的对象能调自己类的方法 狭义上的封装:将属性和方法藏起来 私有属性/私有方法 python没有真正意义的私有属性,可以通过调用实例 ...
随机推荐
- 数据持久化之Android文件系统(一)
阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680 一.前言 文件系统一直是Android开发过程中经常接触的东西.而关于内 ...
- 【题解】Ride to Office
题目描述 起点与终点相隔4500米.现Charley 需要从起点骑车到终点.但是,他有个习惯,沿途需要有人陪伴,即以相同的速度, 与另外一个人一起骑.而当他遇到以更快的速度骑车的人时,他会以相应的速度 ...
- grafana初体验
1.centos版下载安装 wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.0.4-1.x86_6 ...
- webpack--前端自动化工具
一.下载与安装 //全局安装webpack (不推荐) npm i webpack -g npm i webpack-cli -g //局部安装(推荐) npm i webpack -D npm i ...
- python爬虫爬取ip记录网站信息并存入数据库
import requests import re import pymysql #10页 仔细观察路由 db = pymysql.connect("localhost",&quo ...
- https原理 就是两次http
客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤: (1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接. (2)Web服务器收到客户端请求后,会将网站的证书 ...
- 笔记63 Spring Boot快速入门(三)
SpringBoot中使用JSP Springboot的默认视图支持是Thymeleaf,但是Thymeleaf还没开始学,熟悉的还是jsp,所以要让Springboot支持 jsp. 一.在pom. ...
- sping+quartz定时任务的最简单实践
1,启动spring容器 Tomcat启动的时候,加载web.xml的listener和context-param,spring的listener监听到对应的contextConfigLocation ...
- JavaIO流之字节流
什么是字节? 所谓字节(Byte),是计算机数据存储的一种计量单位.一个二进制位称为比特(bit),8个比特组成一个字节,也就是说一个字节可以用于区分256个整数(0~255).由此我们可以知道,字节 ...
- java-逻辑处理
类名是ItemDAO package dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.s ...