内置函数
1.property
property装饰的方法不能再传参数
基本作用:把方一个属性法伪装成一个属性。
class A:
@property #property装饰器
def func(self):pass
作用:对@property方法实现赋值操作,有且只能有一个参数new
class A:
def __init__(self,name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter #负责对property方法进行修改
def name(self,new):
self.__name = new
作用:对@property方法实现删除操作
class A:
def __init__(self,name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter
def name(self,new):
self.__name = new
@name.deleter #让property方法具备删除的操作
def name(self):
del self.__name
2.classmethod
作用:在类中定义一个类方法,是一个装饰器。
什么时候用?
如果你整个方法中没有用到对象空间中的变量,而用到了类空间中的变量或方法(普通方法或者property方法)
类方法的默认参数:类名
类方法的调用方式:类名调用
在类调用时还是一个方法
3.staticmethod
将普通方法放到类中,就是在方法前加上staticmethod装饰器。
这个函数就不需要默认传参
静态方法的调用方式:类名调用
在任何情况下staticmethod都是一个函数
4.isinstance
作用:判断对象和类的关系
class A:
pass
class B(A):
pass
a = A()
b = B()
print(type(a) is A) #True
print(type(b) is A) #Flase
print(isinstance(a,A)) #True
print(isinstance(b,A)) #True,b是子类实例化的对象,所以和A也有继承关系
print(isinstance(a,B)) #Flase
5.issubclass
作用:判断子类和父类之间的关系
class A:
pass
class B(A):
pass
print(issubclass(A,B)) #False
print(issubclass(B,A)) #True,B是A的子类
反射
what:使用字符串数据类型的变量名来获取这个变量的值
why and where:
- input,用户输入的全部都是字符串
- 文件操作,文件写入读出都是字符串
- 网络,传输都是先转成字符串才能进行其他操作
how:
1.反射类中的变量
getattr(变量名:类空间,字符串:命名空间的变量名)
通过getattr反射类中的方法,要通过手动加括号执行。
推荐反射静态属性,静态方法,类方法
如果在类中反射不到变量名,会报错,可以通过传入默认参数,不报错,但是通常情况下需要联合hasattr一起用
2.反射对象中的变量
格式:getattr(变量名:对象空间,字符串:命名空间的变量名)
推荐通过对象反射对象属性和类中的普通方法
3.反射模块中的变量
格式:getattr(变量名:模块名,字符串:命名空间的变量名)
多用于自定义模块
4.反射本文件中的变量
找到自己的命名空间:
import sys
本文件的命名空间:
sys.modules[__name__]
所以反射这么用:getattr(sys.modules[__name__],字符串形式的‘变量名’)
作用:判断空间内是否存在这个变量,返回True和False
格式:hasattr(空间名,需要判断的反射的变量名)
与getattr是伴生关系。
作用:向某一个空间中创建一个变量
格式:setattr(空间名,反射的变量名,变量值)
作用:通过反射删除空间中的变量
格式:delattr((空间名,需要删除的反射的变量名)
内置方法
定义:在不需要程序员定义,本身就存在类中的方法就是内置方法
格式:内置方法通常是这样的__名字__
触发机制:所有的双下方法都不需要我们直接调用,都有另一种自动触发的语法
触发机制:当你打印对象名时触发,打印__str__返回值;当你打印%s时也会触发,在str强转数据类型时
触发机制:是__str__的备胎,当没有__str__的时候执行__repr__
特殊机制:执行repr内置函数和格式化输出%r时,对应的结果是__repr__的返回值。
在子类继承父类的时,且子类与父类中都有__str__与__repr__内置方法
class Foo:
def __str__(self):
return 'Foo str'
def __repr__(self):
return 'Foo repr'
class Son(Foo):
def __str__(self):
return 'Son str'
def __repr__(self):
return 'Son repr'
son = Son()
print(son)
执行的顺序是怎么样的?
首先son对象执行Son类中的__str__,随后执行父类Foo中的__str__,再返回执行Son类中的__repr__最后执行父类中的__repr__