面向对象——组合、封装、访问限制机制、property内置装饰器
面向对象——组合、封装、访问限制机制、property
组合
什么是组合?
组合指的是一个对象中,包含另一个或多个对象
为什么要组合?
减少代码的冗余
怎么用组合?
# 综合实现
# 父类
class People:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
# 老师类
class Teacher(People):
def __init__(self, name, age, sex):
super().__init__(name, age, sex)
# 学生类
class Student(People):
def __init__(self, name, age, sex):
super().__init__(name, age, sex)
# 日期类
class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
def tell_birth(self):
print(f"""
========== 出生年月日 =========
年:{self.year}
月:{self.month}
日:{self.day}
""")
tea1 = Teacher('tank', 25, "男")
date_obj = Date(1994, 6, 6)
tea1.date_obj = date_obj
print(tea1.name, tea1.age, tea1.sex)
tea1.date_obj.tell_birth()
PS:继承是类与类的关系,子类继承父类的属性,是“从属关系”
组合是对象与对象的关系,一个对象拥有另一个对象的属性和方法,是“什么有什么的关系”
封装
什么是封装?
封装指的是可以将一堆属性和方法,封装到对象中
PS:存不是目的,目的是为了取,可以通过 对象. 的方式获取属性和方法
为什么要封装?
为了更方便数据的存取
如何实现封装?
# 封装很简单
class User:
# 将x封装到User类中
x = 10
# 将func方法封装到User类中
def func(self):
pass
obj = User
print(obj.x)
访问限制机制
什么是访问限制机制?
凡是在类内部定义的属性或方法,以__开头的名字,都会被限制,外部不能直接访问
PS:凡是在类内部定义的属性或方法,都会变形为_类名__属性/方法(python特有的)
class User:
__name = "kang"
def __run(self):
print("kang is running....")
# print(User.__name)
obj = User()
print(obj._User__name) # kang
为什么要有访问限制机制?
可以将一些隐私的数据,隐藏起来,不让外部轻易获取
class User:
__name = "kang"
__age = 18
__sex = "男"
__ID = 2156131316561316516131
__bal = 1500000000000000000
def parse_user(self, username, password):
if username == "kang" and password == "123":
print(f"""
通过验证,获取用户信息
用户名:{self.__name}
用户年龄:{self.__age}
用户性别:{self.__sex}
用户ID:{self.__ID}
用户资产:{self.__bal}
""")
else:
print("校验失败,无法查询用户信息")
def __run(self):
print("kang is running....")
obj = User()
obj.parse_user("kang", "123")
property
什么是property?
property是一个python内置的装饰器,可以装饰在类内部的方法上
可以将该方法调用方式由 对象.方法() 转换为 对象.方法 (少了括号)
为什么用property?
在某些场景下,调用的方法只是用来获取计算后的某个值
必须通过 对象.方法() 方式调用,让该方法看起来像动词
目的是为了迷惑调用者,调用的方法误以为是属性,让名词的方法,调用时更加合理
怎么用?
class User:
def __init__(self, name, weight, height):
self.__name = name
self.weight = weight
self.height = height
@property
def bmi(self):
return self.weight / (self.height ** 2)
@property
def name(self):
return self.name
@name.setter
def name(self, value):
self.__name = value
@name.deleter
def name(self):
del self.name
user_obj = User("kang", 50, 1.7)
print(user_obj.bmi) # 这里user_obj.bmi后面应该有括号的,但是用了property就不用了
面向对象——组合、封装、访问限制机制、property内置装饰器的更多相关文章
- python基础语法16 面向对象3 组合,封装,访问限制机制,内置装饰器property
组合: 夺命三问: 1.什么是组合? 组合指的是一个对象中,包含另一个或多个对象. 2.为什么要用组合? 减少代码的冗余. 3.如何使用组合? 耦合度: 耦: 莲藕 ---> 藕断丝连 - 耦合 ...
- property内置装饰器函数和@name.setter、@name.deleter
# property # 内置装饰器函数 只在面向对象中使用 # 装饰后效果:将类的方法伪装成属性 # 被property装饰后的方法,不能带除了self外的任何参数 from math import ...
- python进阶04 装饰器、描述器、常用内置装饰器
python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...
- python内置装饰器
前言 接着上一篇笔记,我们来看看内置装饰器property.staticmethod.classmethod 一.property装饰器 1. 普通方式修改属性值 code class Celsius ...
- classmethod、staticclassmethod内置装饰器函数
# method 英文是方法的意思 # classmethod 类方法 # 当一个类中的方法中只涉及操作类的静态属性时,此时在逻辑上,我们想要直接通过类名就可以调用这个方法去修改类的静态属性,此时可以 ...
- Python内置装饰器@property
在<Python装饰器(Decorators )>一文中介绍了python装饰器的概念,日常写代码时有一个装饰器很常见,他就是内置的@property. 我们一步步的来接近这个概念. 一个 ...
- 内置装饰器二:@property
property 装饰器的作用 property 装饰器将方法包装成属性,将私有属性公有化,此属性只能被读取.相当于实现get方法的对象 class People: def __init__(self ...
- 面向对象之classmethod和staticmethod(python内置装饰器)
对象的绑定方法复习classmethodstaticmethod TOC 对象的绑定方法复习 由对象来调用 会将对象当做第一个参数传入 若对象的绑定方法中还有其他参数,会一并传入 classmetho ...
- Python 内置装饰器
内置的装饰器 内置的装饰器和普通的装饰器原理是一样的,只不过返回的不是函数,而是类对象,所以更难理解一些. @property 在了解这个装饰器前,你需要知道在不使用装饰器怎么写一个属性. d ...
随机推荐
- django rest framework 认证组件
1.认证组件 1.认证组件 1.认证组件 1.认证组件
- Python学习笔记7 头文件的添加规则(转载)
转载自:https://www.cnblogs.com/taurusfy/p/7605787.html ************************************************ ...
- 接口测试中,数据驱动时,参数各类型,空或None的处理
天天说接口测试,天天说数据驱动,但网上的各种教程太烂,遇到实际情况就傻眼了. 来来来,我们看一个例子 假设,有下面这样一个接口,获取用户信息,可以带的参数如下: 用户名(uname) str(),非必 ...
- 实现:笑脸_Crack
直接载入OD,观察发现弹窗可能为MessageBox,那么进行对windows api函数的搜索 跟进反汇编窗口跟随函数,来到这里,直接进行断点操作 运行程序,跑到断点处,如下图 接着发现堆栈窗口有调 ...
- [RN] React Native 好用的时间线 组件
React Native 好用的时间线 组件 效果如下: 实现方法: 一.组件封装 CustomTimeLine.js "use strict"; import React, {C ...
- 洛谷 P2023 [AHOI2009]维护序列 题解
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...
- 【border树】【P2375】动物园
Description 给定一个字符串 \(S\),对每个前缀求长度不超过该前缀一半的公共前后缀个数. 共有 \(T\) 组数据,每组数据的输出是 \(O(1)\) 的. Limitations \( ...
- java信号量
维基百科解释的信号量概念如下 信号量(英语:semaphore)又称为信号标,是一个同步对象,用于保持在0至指定最大值之间的一个计数值.当线程完成一次对该semaphore对象的等待(wait)时,该 ...
- 应用JWT进行用户认证及Token的刷新
本文将通过实际的例子来演示如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新方案(ASP.NET Core 系列目录) 一.什么是JWT? JWT(json web token ...
- 几句话总结一个算法之Policy Gradients
强化学习与监督学习的区别在于,监督学习的每条样本都有一个独立的label,而强化学习的奖励(label)是有延后性,往往需要等这个回合结束才知道输赢 Policy Gradients(PG)计算某个状 ...