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

一、私有化

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. 圆角效果 border-radius——阴影 box-shadow——为边框应用图片 border-image

    1.圆角效果 border-radius border-radius: 5px 4px 3px 2px; /* 四个半径值分别是左上角.右上角.右下角和左下角,顺时针 */ 不要以为border-ra ...

  2. excel转换成实体

    package com.cinc.ecmp.utils; import java.io.IOException; import java.io.InputStream; import java.lan ...

  3. 装饰器&偏函数与作用域与异常处理与文件读写

    装饰器 概念:是一个闭包,把一个函数当做参数返回一个替代版的函数,本质上就是一个返回函数的函数 简单的装饰器 def func1(): print("sunck is a good man& ...

  4. 解决IDEA下tomcat启动server乱码

    亲测成功的方式: 配置TOMCAT时,在VM  opthions 添加 -Dfile.encoding=UTF-8

  5. C++虚继承初识

    struct Employee { ... }; struct Manager : Employee { ... }; struct Worker : Employee { ... }; struct ...

  6. JLINK、ULINK和STlink仿真器详解

    JLink仿真器 德国SEGGER公司推出基于JTAG的仿真器.简单地说,是给一个JTAG协议转换盒,即一个小型USB到JTAG的转换盒,其连接到计算机用的是USB接口,而到目标板内部用的还是jtag ...

  7. java环境所遇问题

    在javac能运行通过并且生成了.class文件但是java文件在运行时通不过出现上面图片情况,试了一上午发现我的和别人好像不一样,下面展示我的情况, 之前用户变量那里新建了一个classpath,不 ...

  8. PyTorch深度学习:60分钟入门(Translation)

    这是https://zhuanlan.zhihu.com/p/25572330的学习笔记. Tensors Tensors和numpy中的ndarrays较为相似, 因此Tensor也能够使用GPU来 ...

  9. 9. SOFAJRaft源码分析— Follower如何通过Snapshot快速追上Leader日志?

    前言 引入快照机制主要是为了解决两个问题: JRaft新节点加入后,如何快速追上最新的数据 Raft 节点出现故障重新启动后如何高效恢复到最新的数据 Snapshot 源码分析 生成 Raft 节点的 ...

  10. Mac常用的软件推荐

    Alfred 效率软件,让能更快的启动各种软件 VScode 编辑器,市面上最热的编辑器,好用的不只是一点点,加上Vim插件简直就是秒杀市面上各种IDE PicGo 一个开源图床软件,支持各大网站的图 ...