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. acwing 110 防晒

    https://www.acwing.com/problem/content/description/112/ 有C头奶牛进行日光浴,第i头奶牛需要minSPF[i]到maxSPF[i]单位强度之间的 ...

  2. shell通配符, 变量, shell作用域

    1. 指定格式输出当前时间: echo `date +%Y%m%d`  # 注意使用反引号, +号后面不要有空格 反引号中的东西会被当做命令来执行, 并输出执行的结果 2. $uid用于判断当前是否是 ...

  3. 【转】SQL中GROUP BY语句与HAVING语句的使用

    一.GROUP BY GROUP BY语句用来与聚合函数(aggregate functions such as COUNT, SUM, AVG, MIN, or MAX.)联合使用来得到一个或多个列 ...

  4. 创意编程,Python开发多功能壁纸自动切换工具!

    import ctypes import time import requests import os from threading import Thread from tkinter import ...

  5. 14-scrapy框架(CrawlSpider)

    CrawlSpider介绍 CrawlSpider是Spider的一个子类,意味着拥有Spider的方法,以及自己的方法,更加高效简洁.其中最显著的功能就是"LinkExtractors&q ...

  6. Javascript模块化开发1——package.json详解

    一.环境安装 Node.js 安装包及源码下载地址为:https://nodejs.org/en/download/. 在该页面你可以根据不同平台系统选择你需要的 Node.js 安装包. Node. ...

  7. [IDA] 将变量索引进行计算

    按 k 键 [ebp+var+arg_0] - > [ebp+value]

  8. python基础(19):random模块、time模块、sys模块、os模块

    1. random模块 导入的是random模块,格式是: import random 1.1 随机小数 取随机小数 : 数学计算. print(random.random()) # 取0-1之间的小 ...

  9. ArchLinux 2019.11.01安装流程--安装基本系统

    安装前的一些话 本文是参考官方文档ArchLinux的Installation guide(简体中文)加实际操作编写的. 有啥都好说,转载时请注明作者,这是基本素质,也是法律要求 安装是在虚拟机上进行 ...

  10. CSS3 新增选择器

    CSS3 新增选择器 结构(位置)伪类选择器(CSS3) :first-child :选取属于其父元素的首个子元素的指定选择器 :last-child :选取属于其父元素的最后一个子元素的指定选择器 ...