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 封装、(属性、静态方法、类方法)语法糖、反射的更多相关文章

  1. python面向对象之静态属性/静态方法/类方法/组合

    继续学习,不要松懈 #!/usr/bin/env python # coding:utf-8 class Campus: def __init__(self,name,addr,type): self ...

  2. C# 9 record 并非简单属性 POCO 的语法糖

    C# 9 record 并非简单属性 POCO 的语法糖 最近升级专案到大统一 .NET 5 并使用 C#9 语法尝试改写套件,发现之前以为 record 只是简单属性 POCO 的简化语法糖的认知是 ...

  3. 【Python】从1<2<3的语法糖说起

    python有一个很有意思的语法糖你可以直接写1<2<3. 这复合我们通常意义上的数学不等式,但对学过C等语言其实是有疑惑的. 我们知道不等式返回的其实是个Bool值,在C中是1,0因此C ...

  4. 第8.25节 Python风格的__getattribute__属性访问方法语法释义及使用

    一. 引言 在<第8.13节 Python类中内置方法__repr__详解>老猿介绍了在命令行方式直接输入"对象"就可以调用repr内置函数或__repr__方法查看对 ...

  5. Python中语法糖及带参语法糖

    在python中,@符号常被称作语法糖(装饰器),在某函数定义时,用以包装该函数,以达到截取,控制该函数的目的. def d(f): print('d...') k=f #此处保留了传进来的原函数 f ...

  6. vue3 学习笔记(九)——script setup 语法糖用了才知道有多爽

    刚开始使用 script setup 语法糖的时候,编辑器会提示这是一个实验属性,要使用的话,需要固定 vue 版本. 在 6 月底,该提案被正式定稿,在 v3.1.3 的版本上,继续使用但仍会有实验 ...

  7. Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())

    Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分    ...

  8. python面向对象学习(六)类属性、类方法、静态方法

    目录 1. 类的结构 1.1 术语 -- 实例 1.2 类是一个特殊的对象 2. 类属性和实例属性 2.1 概念和使用 2.2 属性的获取机制 3. 类方法和静态方法 3.1 类方法 3.2 静态方法 ...

  9. python类属性和类方法(类的结构、实例属性、静态方法)

    类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...

随机推荐

  1. 在Ubuntu环境下配置Proxmark3(PM3)使用环境

    参考资料:PM3官方Wiki 因为国内网络上大多是在Kali系统上使用PM3的教程(链接1.链接2.链接3),而这些教程的步骤对于Ubuntu系统并不完全适用.所以写下本文,记录我个人的安装经历. 本 ...

  2. Python 列表生成式 & 字典生成式

    Python 列表生成式 & 字典生成式 通过生成式可以更加简洁地生成列表和字典 列表生成式 对比 直接生成数据后加入列表示例: user_list = list() for i in ran ...

  3. 2019.08.06模拟赛T2

    题目大意: 已知三个$n$位二进制数$A$,$B$,$C$. 满足: $A+B=C$ 它们二进制位中$1$的个数分别为$a$,$b$,$c$. 求满足条件的最小的$C$. Solution 唉,又是一 ...

  4. __format__

    目录 一.__format__ 一.__format__ 自定制格式化字符串 date_dic = { 'ymd': '{0.year}:{0.month}:{0.day}', 'dmy': '{0. ...

  5. Python连载45-XML解析(使用minidom和etree分别示例)

    一.我们对XML的读取进行一波演示 import xml.dom.minidom #负责解析xml文件的包 from xml.dom.minidom import parse ​ #使用minidom ...

  6. 现象:SpringApplication.run后面的语句未执行

    下面的两种情况下,红色的log.info中的内容一直没有执行,和预期不符. 看来,需要在@PostConstruct修饰的函数.CommandLineRunner的run方法中调用 另外的线程 来执行 ...

  7. 实验:用Unity抓取指定url网页中的所有图片并下载保存

    突发奇想,觉得有时保存网页上的资源非常麻烦,有没有办法输入一个网址就批量抓取对应资源的办法呢. 需要思考的问题: 1.如何得到网页url的html源码呢? 2.如何在浩瀚如海的html中匹配出需要的资 ...

  8. 洛谷 P4124 (数位 DP)

    ### 洛谷 P4124 题目链接 ### 题目大意: 给你一段区间,让你求满足下列两个条件时的数的个数. 1.至少有 3 个相邻相同数字 (即 111 .1111 .222 等) 2.不能同时出现 ...

  9. 《Head First C#》外星人入侵WPF编写源码

    目录 引言 前期工作 只要努力没有什么困难可以难倒你,加油骚年! @(外星人入侵(WPF编写)) 引言 自学的C#,看了几本教材讲的都是程序代码,网上找的也有视屏,但都比较老了.只会打些代码为不晓得为 ...

  10. 怎样深入学习php,成为php高手!?

    本文章开头我想问一句话:PHP是做什么的? 因为这是面试中会问到的一个问题,虽然它看起来很简单,回答做网站的,也就是个简单建站的水平.回答做网站后端开发的,对PHP有了一定的认识,回答做后端处理的,有 ...