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. pytroch中cp27m和cp27mu的区别及判别方法

    python中m和mu的区别 从https://download.pytorch.org/whl中下载pytorch安装包时常会发现有相同版本的安装包有cp27m和cp27mu两种,其中cp27m是u ...

  2. vue表格合并行的一个实例

        一.element控件实现 在平常的应用中,需要用到合并单元格的操作,在Excel中,这种操作很好实现,但在实际项目中,常常需要借助element控件来实现. 下面是element中的一个实例 ...

  3. [java 基础]反射入门

    原文 概况 使用java的反射,可以让我们检查(或者修改)类,接口,字段,方法的特性.当你在编译期不知道他们的名字的时候非常有用. 除此之外,可以使用反射来创建实例,调用方法或者get/set 字段值 ...

  4. Java连载43-访问静态方法其他注意事项、static关键字

    一.其他注意点 1.对于带有static的方法,我们讲过需要用“类名.”的方式进行访问,但是其实我们使用“引用.”的方式也是可以进行访问这个方法的举例. package com.bjpowernode ...

  5. tomcat9上传文件失败错误

    项目上线正常运行一段时间后,有一天突然所有的附件上传都出现了错误,查找项目本身的日志系统也一致没有跟踪到错误.经过几番折腾,在tomcat9-stdout.log日志中发现如下异常: ERROR or ...

  6. 错误InnoDB:Attemptedtoopenapreviouslyopenedtablespace.

    2013-08-04 13:48:22 760 [ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous t ...

  7. oracle 关联更新

    不多说了,我们来做实验吧. 创建如下表数据 select * from t1 ; select * from t2; 现需求:参照T2表,修改T1表,修改条件为两表的fname列内容一致. 方式1,u ...

  8. 安装keepalived OpenSSL is not properly installed on your system. !!!

    错误信息: configure: error: !!! OpenSSL is not properly installed on your system. !!! !!! Can not includ ...

  9. MySQL 中的外键

    表和表之间可存在引用关系,这在抽象数据到表时,是很常见的.这种联系是通过在表中创建外键(foreign key)来实现的. 比如一个订单,可能关联用户表和产品表,以此来记录谁买了什么产品. 约定两个概 ...

  10. java基础(8):Eclipse开发工具

    1. Eclipse开发工具 Eclipse是功能强大Java集成开发工具.它可以极大地提升我们的开发效率.可以自动编译,检查错误.在公司中,使用的就是Eclipse进行开发. 1.1 Eclipse ...