定义:在类中将方法和属性隐藏起来

一、私有化

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 封装的更多相关文章

  1. [C#] 简单的 Helper 封装 -- RegularExpressionHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. iOS开发之App间账号共享与SDK封装

    上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ...

  3. Ajax实现原理,代码封装

    都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ...

  4. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  5. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

  6. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  7. 封装集合(Encapsulate Collection)

    封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用. 当一个类的属性类 ...

  8. CSharpGL(29)初步封装Texture和Framebuffer

    +BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(29)初步封装Texture和Framebuffer +BIT祝威+悄悄在此留下版了个权的信息说: Texture和Framebuffe ...

  9. CSharpGL(7)对VAO和VBO的封装

    CSharpGL(7)对VAO和VBO的封装 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入门参考 ...

随机推荐

  1. JavaScript DOM查询,原生js实现元素子节点的获取

    在网页网页开发中,经常会需要获取某个网页元素的子元素,然后对其进行事件绑定.或样式修改等行为.这些操作对于jquery来说很容易,但是对于原生js会稍微麻烦一些,这里将介绍四种方法获取元素的子元素(本 ...

  2. 2018-9-14-win10-UWP-标题栏后退

    title author date CreateTime categories win10 UWP 标题栏后退 lindexi 2018-9-14 20:22:8 +0800 2018-2-13 17 ...

  3. redis scan count的含义/二进制安全问题

    redis是单线程的,keys查询键类似hbase的全表扫描(也可以理解为select *),大数据量时非常耗时,因此官方给出了scan,使用scan类似数据库分页,可以指定查询多少个元素,官网的说明 ...

  4. Java面向对象程序设计第8章3-5

    Java面向对象程序设计第8章3-5 3.String类型有什么特点? 一旦赋值,便不能更改其指向的字符对象 如果更改,则会指向一个新的字符对象 不能为null 4.String什么时候进行值比较,什 ...

  5. 我们基于kaldi开发的嵌入式语音识别系统升级成深度学习啦

    先前的文章<三个小白是如何在三个月内搭一个基于kaldi的嵌入式在线语音识别系统的>说我们花了不到三个月的时间搭了一个基于kaldi的嵌入式语音识别系统,不过它是基于传统的GMM-HMM的 ...

  6. JSR-133内存模型手册

    1.介绍 JVM支持多种线程的执行,Threads代表的是线程类,位于java.lang.Thread包下,唯一的方式就是为用户在这个类下的对象创建线程,每一个线程关联着一个对象,一个线程将在star ...

  7. CodeForces - 786B -- 线段树优化建图

    刚开始想了两个小时,打算把区间分块然后计算,但是这就很灵性了看了一个大佬的博客,侵删 #include<cstring> #include<iostream> #include ...

  8. mysql主从之LVS+keepalived+双主MySQL 负载均衡

    LVS(Linux Virtual Server)即Linux 虚拟服务器,是一个的开源负载均衡项目,目前LVS 已经被集成到Linux 内核模块中.LVS 是四层负载均衡,也就是说建立在OSI 模型 ...

  9. xshell连接不上ubuntu---could not connect to 'ip' (port 22): Connection failed.

    可能是没有开启ssh server,接下来就是开启服务就好.命令如下: sudo apt-get install openssh-server 这样就OK啦

  10. linux tomcat安装

    一.下载tomcat包 下载tomcat包并上传至服务器中 解压文件: tar -zxvf apache-tomcat-8.5.47.tar.gz 为了后期程序的便于管理,我们还需要将Tomcat复制 ...