pyton 封装
定义:在类中将方法和属性隐藏起来
一、私有化
1、格式
__名字,在名字前加双下划线
2、私有化对象
对象属性
静态属性
普通方法
3、作用
1)在类的外面不能直接调用类的方法和属性
2)类的属性值不能随意更改
3)子类不能通过继承获取父类的私有化属性和方法
4、实质
在代码层次做了变形,在类的外部仍可通过 对象名或类命_类命__名字,来调用,不推荐使
class Person:
__country = 'china' def __init__(self, name, sex, age):
self.__name = name
self.__sex = sex
self.__age = age def get_age(self):
"""
对象属性__age,私有化无法直接调用
通过get_age方法实现
:return: self.__age
"""
# print(self.__dict__)
return self.__age def set_age(self, new_age):
"""
对象属性__age,私有化无法直接修改
通过set_age方法实现,并规定属性值只能是数字
:param new_age:
:return:赋值类型不符合规定,返回的内容
"""
if new_age.isdigit():
self.__age = new_age
else:
return '输入错误,请输入年龄' class Worker(Person):
def __init__(self, name, sex, age, job):
super().__init__(name, sex, age)
self.job = job def test(self):
print(self.name) w1 = Worker('tom', 'm', '', 'joker')
print(w1.test()) # AttributeError: 'Worker' object has no attribute 'name'
p1 = Person('tom', 'm', '')
print(p1.get_age()) #
print(p1.set_age('wt')) # 输入错误,请输入年龄
print(p1.get_age()) #
p1.set_age('')
print(p1.get_age()) #
print(p1._Person__age) # 私有化的实质是在代码层次进行变形,格式p1.name-> p1._Person__name, 不推荐使用
print(Person._Person__country) # 静态属性私有化,不推荐使用
二、property
1、property是内置装饰函数,只在面向对象中使用
2、作用
方法属性,给方法加上装饰器,可以在类的外部直接调用方法名而不是调用方法名()
动词:方法,名词:属性
from math import pi class Circle:
def __init__(self, r):
self.__r = r @property # 方法->属性
def area(self):
return round(pi * pow(self.__r, 2), 2) c1 = Circle(5)
print(c1.area)
3、修改
属性私有化,在类的外部不改变该属性的调用方法
class Phone:
"""
price私有化
使用property装饰price方法,在类的外部调用,和没有私有化做比较,不会感到明显的差异
使用方法名.setter装饰同名方法,来修改
"""
def __init__(self, name, price):
self.name = name
self.__price = price @property
def price(self):
return self.__price @price.setter
def price(self, new_price):
self.__price = new_price red_mi = Phone('mi', 1500)
print(red_mi.price) #
red_mi.price = 2000 # 修改价格
print(red_mi.price) #
3、删除
不常用
class Phone:
"""
price私有化
使用property装饰price方法,在类的外部调用,和没有私有化做比较,不会感到明显的差异
使用方法名.setter装饰同名方法,来修改
"""
def __init__(self, name, price):
self.name = name
self.__price = price @property
def price(self):
return self.__price @price.setter
def price(self, new_price):
self.__price = new_price @price.deleter
def price(self):
del self.__price red_mi = Phone('mi', 1500)
print(red_mi.price) #
red_mi.price = 2000 # 修改价格
print(red_mi.price) #
del red_mi.price # 根据 del 到 price.deleter, 实质是执行price.deleter装饰器下的price方法
print(red_mi.price) # 报错,因为已经被删除
4、总结
1)property是内置装饰器
2)查
私有化属性,可以通过定义同名方法和property装饰器,而不改变在类外部的调用方法
3)改
查实现后,才能实现删
私有化属性,可以通过定义同名方法和property装饰器,而不改变在类外部的调用方法
通过同方法.setter装饰器,装饰同名方法来修改私有化属性,而不改变在类外部的修改方法
4)删
不常用
三、classmethod
类方法
作用:把一个对象方法,变成类方法,调用该方法可以直接通过类,而不需要对象
格式:有一个默认参数,cls
什么时候用到:一个方法与私有化静态属性产生联系
class Student:
__country = 'china' def __init__(self, name):
self.__name = name @property
def info(self):
return '%s is %s' % (self.__name, Student.__country) @classmethod # classmethod有一个默认参数,cls
def con(cls, new_country):
cls.__country = new_country Student.con('USA')
s1 = Student('tom')
print(s1.info) # tom is USA
四、staticmethod
静态方法
1)作用
在完全面向对象的程序中,若果一个函数,即和对象没有关系,也和类没有关系,那么就可以用staticmethod装饰该函数,作为类的静态方法
2)细节
静态方法在类的内部,在静态方法中可以直接调用类,在类的外部可以通过类名调用静态方法
class Login:
def __init__(self, name, pwd):
self.name = name
self.pwd = pwd def login(self):
if self.name == 'tom' and self.pwd == 'abc-123':
print('登录成功!') @staticmethod
def name_pwd():
name = input('请输入用户名:')
pwd = input('请输入密码:')
Login(name, pwd) # 在静态方法中可以直接调用类 Login.name_pwd() # 用类调用静态方法
类方法和静态方法小结
1、都通过类名调用
2、类方法有一个默认参数,静态方法没有
3、类方法:和静态属性有关,通过类直接调用方法,不需要通过对象
4、静态方法:和类及对象没有关系,但又是必要的方法,python可以不用(面向对象和面向函数),完全面向对象必须用
pyton 封装的更多相关文章
- [C#] 简单的 Helper 封装 -- RegularExpressionHelper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- iOS开发之App间账号共享与SDK封装
上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ...
- Ajax实现原理,代码封装
都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ...
- 用C语言封装OC对象(耐心阅读,非常重要)
用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...
- 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)
前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...
- 封装集合(Encapsulate Collection)
封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用. 当一个类的属性类 ...
- CSharpGL(29)初步封装Texture和Framebuffer
+BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(29)初步封装Texture和Framebuffer +BIT祝威+悄悄在此留下版了个权的信息说: Texture和Framebuffe ...
- CSharpGL(7)对VAO和VBO的封装
CSharpGL(7)对VAO和VBO的封装 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入门参考 ...
随机推荐
- JavaScript DOM查询,原生js实现元素子节点的获取
在网页网页开发中,经常会需要获取某个网页元素的子元素,然后对其进行事件绑定.或样式修改等行为.这些操作对于jquery来说很容易,但是对于原生js会稍微麻烦一些,这里将介绍四种方法获取元素的子元素(本 ...
- 2018-9-14-win10-UWP-标题栏后退
title author date CreateTime categories win10 UWP 标题栏后退 lindexi 2018-9-14 20:22:8 +0800 2018-2-13 17 ...
- redis scan count的含义/二进制安全问题
redis是单线程的,keys查询键类似hbase的全表扫描(也可以理解为select *),大数据量时非常耗时,因此官方给出了scan,使用scan类似数据库分页,可以指定查询多少个元素,官网的说明 ...
- Java面向对象程序设计第8章3-5
Java面向对象程序设计第8章3-5 3.String类型有什么特点? 一旦赋值,便不能更改其指向的字符对象 如果更改,则会指向一个新的字符对象 不能为null 4.String什么时候进行值比较,什 ...
- 我们基于kaldi开发的嵌入式语音识别系统升级成深度学习啦
先前的文章<三个小白是如何在三个月内搭一个基于kaldi的嵌入式在线语音识别系统的>说我们花了不到三个月的时间搭了一个基于kaldi的嵌入式语音识别系统,不过它是基于传统的GMM-HMM的 ...
- JSR-133内存模型手册
1.介绍 JVM支持多种线程的执行,Threads代表的是线程类,位于java.lang.Thread包下,唯一的方式就是为用户在这个类下的对象创建线程,每一个线程关联着一个对象,一个线程将在star ...
- CodeForces - 786B -- 线段树优化建图
刚开始想了两个小时,打算把区间分块然后计算,但是这就很灵性了看了一个大佬的博客,侵删 #include<cstring> #include<iostream> #include ...
- mysql主从之LVS+keepalived+双主MySQL 负载均衡
LVS(Linux Virtual Server)即Linux 虚拟服务器,是一个的开源负载均衡项目,目前LVS 已经被集成到Linux 内核模块中.LVS 是四层负载均衡,也就是说建立在OSI 模型 ...
- xshell连接不上ubuntu---could not connect to 'ip' (port 22): Connection failed.
可能是没有开启ssh server,接下来就是开启服务就好.命令如下: sudo apt-get install openssh-server 这样就OK啦
- linux tomcat安装
一.下载tomcat包 下载tomcat包并上传至服务器中 解压文件: tar -zxvf apache-tomcat-8.5.47.tar.gz 为了后期程序的便于管理,我们还需要将Tomcat复制 ...