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

一、私有化

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通过URL获取参数

    // 函数方法 function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=( ...

  2. vue中动态class写法

    <div class="wrap" :class="{active:index==current}"></div> <div cl ...

  3. vue-learning:11 -js-nextTick()

    nextTick() 在jQuery中,如果我们要生成一个ul-li的列表元素,我们也不会在循环体中每生成一个li就将它插入到ul中,而是在循环体内拼接每个li,待循环体结束后,再一并添加到ul元素上 ...

  4. Openstack生产环境部署(一)

  5. 学习Java第五周

    通过这一段时间的学习发现Java和C++虽然都是面向对象的编程语言,有相似之处也有不同之处,相似的地方总会感觉易于接受,不同之处或者新接触的有些知识不是很好理解和掌握. 前一段时间学的内部类和接口便是 ...

  6. slim的中间件

    slim中间件的作用简单来说就是过滤数据,request过来的数据要经过中间件才能到达内部,然后内部数据要到达外部的时候,也要经过中间件,正常通过才能到达外部

  7. JAVA8之 Stream 流(四)

    如果说前面几章是函数式编程的方法论,那么 Stream 流就应该是 JAVA8 为我们提供的最佳实践. Stream 流的定义 Stream 是支持串行和并行操作的一系列元素.流操作会被组合到流管道中 ...

  8. docker网络类型访问原理

    • bridge –net=bridge 默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中. • host –net=host 容器不会获得一个独立的netw ...

  9. linux-free、lscpu、

    1.free -h 以人类可读的形式显示 -m 以MB为单位显示 -w 将buffers和cache分开单独显示(针对centos7系统) centos6上: centos7上: -s 动态查看内存信 ...

  10. 006一句话解决主机pc,Vmware虚拟机,开发板之间的ping问题