Python进阶-XVIII 封装、(属性、静态方法、类方法)语法糖、反射
1、封装
类中的私有化:属性的私有化和方法的私有化
会用到私有的这个概念de场景
1.隐藏起一个属性 不想让类的外部调用
2.我想保护这个属性,不想让属性随意被改变
3.我想保护这个属性,不被子类继承
class Room:
"""房间类""" def __init__(self, name, length, width, height):
self.__name = name
self.__length = length
self.__width = width
self.__height = height def get_name(self):
return self.__name def set_name(self, new_name):
if type(new_name) is str and new_name.isdigit() == False: # 新名称是字符串且不能是数字
self.__name = new_name def area(self):
return self.__length * self.__width def volume(self):
return self.__length * self.__width * self.__height room = Room('标准间', 3.6, 3.0, 3.2) print(room.get_name())
room.set_name('豪华间')
print(room.get_name()) print(room.area())
print(room.volume()) # 子类无法继承父类中的私有属性和私有方法 class Foo:
__key = '' # _Foo__key class Son(Foo):
print(Foo.__key) # _Son__key son = Son()
# son.__key # AttributeError: type object 'Foo' has no attribute '_Son__key'
2、属性方法
@property语法糖的使用场景
如果方法不得不使用名词,而规矩是名词是属性,动词是方法。而使用名词是将运算后的值给它。
class Room:
"""房间类""" def __init__(self, name, length, width, height):
self.__name = name
self.__length = length
self.__width = width
self.__height = height def get_name(self):
return self.__name def set_name(self, new_name):
if type(new_name) is str and new_name.isdigit() == False: # 新名称是字符串且不能是数字
self.__name = new_name @property
def area(self): # 名词一般是属性,动词才是方法,为了解决有了属性语法糖
return self.__length * self.__width @property
def volume(self):
return self.__length * self.__width * self.__height room = Room('标准间', 3.6, 3.0, 3.2)
print(room.volume) # 有了@property可以像调用属性一样调用方法
print(room.area)
属性的 查看 修改 删除
class Person:
def __init__(self, name):
self.__name = name @property
def name(self):
return self.__name @name.setter # 修改
def name(self, new_name):
self.__name = new_name @name.deleter # 删除
def name(self):
del self.__name tom = Person('Tom')
print(tom.name)
tom.name = 'Jone'
print(tom.name)
del tom.name # 删除 有了@name.deleter才有效果
# print(tom.name) # AttributeError: 'Person' object has no attribute '_Person__name'
3、静态方法和类方法
method 方法
staticmathod 静态的方法 ***
classmethod 类方法 ****
类的操作行为
1)staticmethod 静态的方法
class Login:
def __init__(self, name, pwd):
self.name = name
self.__password = pwd def login(self):pass @staticmethod # 该语法糖是声明该方法为静态方法
def get_usr_pwd():
usr = input('请输入登录名:》》》').strip()
pwd = input('请输入密码:》》》').strip()
Login(usr, pwd) Login.get_usr_pwd()
静态方法的应用场景:在完全面向对象的程序中,如果一个函数,既跟对象没有关系,
也跟类没有关系 那么就用staticmethod将这个函数变成一个静态方法
2)classmethod 类方法
class Goods:
"""商品类"""
discount_rate = 0.5 def __init__(self, name, price):
self.name = name
self.__price = price @property
def price(self):
return self.__price * Goods.discount_rate @classmethod # 把一个方法 变成一个类中的方法,这个方法就直接可以被类调用,不需要依托任何对象
def change_discount_rate(cls, new_rate):
cls.discount_rate = new_rate apple = Goods('apple', 9.8)
print(apple.price)
# apple.change_discount_rate(0.75) 如此调用合理,商品的折扣率是类的事,不应该由实例来控制!
Goods.change_discount_rate(0.8)
print(apple.price)
类方法的应用场景:
当这个方法的操作只涉及静态属性的时候 就应该使用classmethod来装饰这个方法
3)、小结
类方法和静态方法 都是类调用的
对象可以调用类方法和静态方法么? 可以 一般情况下 推荐用类名调用
类方法 有一个默认参数 cls 代表这个类 cls
静态方法 没有默认的参数 就象函数一样
4、反射
(1)、简介
有此使用场景,知道一个类中的方法名的字符串形式,如何调用该方法?
通过反射
对象名 获取对象属性 和 普通方法
类名 获取静态属性 和类方法 和 静态方法
普通方法 self
静态方法 @staticmethod
类方法 @classmethod
属性方法 @property
(2)、反射的使用场景
class Dog:
fur = 'golden'
def __init__(self, name, kind):
self.name = name
self.kind = kind def bite(self):
print(self.name + "is biting!") def walk(self):
print(self.name + "is walking!"
1)反射对象
dog = Dog('duck','harsci') # 1)、反射对象的属性
if hasattr(dog, 'fur'):
print(getattr(dog, 'fur')) # 2)、反射对象的方法
if hasattr(dog, 'bite'):
getattr(dog, 'bite')()
2)反射类
class A:
year = 2020
@classmethod
def get_year(cls):
print(cls.year)
# 1)获得类的属性
A.year
if hasattr(A, 'year'):
print(getattr(A, 'year'))
# 2)获得类的方法
if hasattr(A, 'get_year'):
getattr(A, 'get_year')() # 如果不加classmethod装饰器,会报错get_year() missing 1 required positional argument: 'self'
3)反射导入的模块
import time t = ''
if hasattr(time, 'time'):
t = getattr(time, 'time')() # 得到当前的时间的时间戳
print(t) t = time.localtime(t) # 将时间戳转化为结构时间 if hasattr(time, 'asctime'):
print(getattr(time, 'asctime')(t)) # asctime必须传结构时间
4)反射自身(坐在的模块)
import sys
# 查看系统中所有模块
print(sys.modules)
# 找到本模块对应的key
# '__main__': < module'__main__'from' D:/python_bases/day27/2_反射进阶.py' > # 1)、获得本模块的属性
print(getattr(sys.modules["__main__"], 'dog').fur) def get_year():
print(time.asctime(time.localtime(time.time())))
# 2)、获得本模块的方法
getattr(sys.modules['__main__'], 'get_year')() # 如果别的模块引入该模块,会无法执行,因为写死了'__main__',要改为变量
__main__ = '__main__'
(3)、反射的剩余方法:
method_str = ['bite', 'walk'] dog = Dog('金毛', '狮子狗') if hasattr(Dog, 'bite'): # 内置函数一
bite = getattr(Dog, method_str[0]) # 内置函数二 bite(dog)
setattr(Dog, 'price', 999) # 内置函数三
print(dog.price) delattr(Dog, 'price') # 内置函数四
Python进阶-XVIII 封装、(属性、静态方法、类方法)语法糖、反射的更多相关文章
- python面向对象之静态属性/静态方法/类方法/组合
继续学习,不要松懈 #!/usr/bin/env python # coding:utf-8 class Campus: def __init__(self,name,addr,type): self ...
- C# 9 record 并非简单属性 POCO 的语法糖
C# 9 record 并非简单属性 POCO 的语法糖 最近升级专案到大统一 .NET 5 并使用 C#9 语法尝试改写套件,发现之前以为 record 只是简单属性 POCO 的简化语法糖的认知是 ...
- 【Python】从1<2<3的语法糖说起
python有一个很有意思的语法糖你可以直接写1<2<3. 这复合我们通常意义上的数学不等式,但对学过C等语言其实是有疑惑的. 我们知道不等式返回的其实是个Bool值,在C中是1,0因此C ...
- 第8.25节 Python风格的__getattribute__属性访问方法语法释义及使用
一. 引言 在<第8.13节 Python类中内置方法__repr__详解>老猿介绍了在命令行方式直接输入"对象"就可以调用repr内置函数或__repr__方法查看对 ...
- Python中语法糖及带参语法糖
在python中,@符号常被称作语法糖(装饰器),在某函数定义时,用以包装该函数,以达到截取,控制该函数的目的. def d(f): print('d...') k=f #此处保留了传进来的原函数 f ...
- vue3 学习笔记(九)——script setup 语法糖用了才知道有多爽
刚开始使用 script setup 语法糖的时候,编辑器会提示这是一个实验属性,要使用的话,需要固定 vue 版本. 在 6 月底,该提案被正式定稿,在 v3.1.3 的版本上,继续使用但仍会有实验 ...
- Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())
Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分 ...
- python面向对象学习(六)类属性、类方法、静态方法
目录 1. 类的结构 1.1 术语 -- 实例 1.2 类是一个特殊的对象 2. 类属性和实例属性 2.1 概念和使用 2.2 属性的获取机制 3. 类方法和静态方法 3.1 类方法 3.2 静态方法 ...
- python类属性和类方法(类的结构、实例属性、静态方法)
类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...
随机推荐
- 《Spring Cloud微服务 入门 实战与进阶》
很少在周末发文,还是由于昨晚刚收到实体书,还是耐不住性子马上发文了. 一年前,耗时半年多的时间,写出了我的第一本书<Spring Cloud微服务-全栈技术与案例解析>. 时至今日,一年的 ...
- electron窗口间通信
以下代码均来自于我开发的开源软件:想学吗 窗口A的渲染进程发消息给主进程 const { clipboard, ipcRenderer, remote } = require('electron'); ...
- Jmeter 压测使用以及参数介绍
. 下载地址 https://jmeter.apache.org/download_jmeter.cgi Binaries¶ 下的apache-jmeter-5.2.1.zipsha512pgp . ...
- IT兄弟连 HTML5教程 HTML5的基本语法 如何选择开发工具
如何选择开发工具 有许多可以编辑网页的软件,事实上你不需要用任何专门的软件来建立HTML页面,你所需要的只是一个文本编辑器(或字处理器),如Office Word.记事本.写字板等.制作页面初学者通常 ...
- 【文本处理命令】之grep搜索命令详解
一.grep搜索命令 在日常使用中grep命令也是会经常用到的一个搜索命令.grep命令用于在文本中执行关键词搜索,并显示匹配的结果. 格式: grep [选项] [文件] Usage: grep [ ...
- 记一次收集APP native崩溃信息
最近在学习 极客时间Android开发高手课 老师推荐了Breakpad开源库来采集native 的crash1.为什么要使用Google Breakpad? 我们在开发过程中,Android JNI ...
- 【centOS】centOS7 下载
地址:http://mirrors.aliyun.com/centos/ 进入国内的阿里云的,这里CentOS 7提供了三种ISO镜像文件的下载:DVD ISO.Everything ISO.Mini ...
- ABP开发框架前后端开发系列---(6)ABP基础接口处理和省份城市行政区管理模块的开发
最近没有更新ABP框架的相关文章,一直在研究和封装相关的接口,总算告一段落,开始继续整理下开发心得.上次我在随笔<ABP开发框架前后端开发系列---(5)Web API调用类在Winform项目 ...
- .net 数据源DataSet 转换成模型
/// <summary> /// DataSet转换成model 自动赋值返回集合 /// </summary> /// <typeparam name="T ...
- WebService 接收JSON字符串
晚上学习时公司的同事,暂且叫A吧,A:“我们公司XXX纺织的AM接口不通,让我看下”,我:“接口写的不是有AJAX异步请求的示例嘛,参考下,我都测试过接口,都是通的.”,A:“我走的不是AJAX,走的 ...