1.staticmethod:(静态方法)
静态方法:让类里的方法直接被类调用,就像正常的函数一样。
class Staticmethod_Demo():
role = 'Aray'
@staticmethod
def func():
print('当普通方法用')
Staticmethod_Demo.func()
输出结果:
当普通方法用
2.classmethod:(类方法)
类方法:默认参数为:cls ,可以直接用类名调用,可以与类属性交互。
class Classmethod_Demo():
role = 'Aray'
@classmethod
def func(cls):
print(cls.role)
Classmethod_Demo.func()
输出结果:
Aray
共同点:
1.都可以直接被类调用,不需要实例化
不同点:
1,类方法必须有一个cls参数表示这这个类,静态方法不需要,不能直接被使用。
绑定方法: 普通方法 类方法
非绑定方法: 静态方法
目前为止学的方法有:
普通方法:默认有一个self对象传进来,并且只能被对象调用
类方法:默认有一个cls传进来表示本类,并且可以被类和对象调用
静态方法:没有默认参数,并且可以被类和对象调用。(这个方法不推荐使用)
3.isinstance
isinstance 作用是: 判断一个对象是不是这个类的对象,传两个参数,分别是对象和类,如果是,返回true,否则,为false。
class Foo:
pass
class Son(Foo):
pass
s = Son() #实例化
print(isinstance(s,Son)) #判断一个对象是不是这个类的对象,传两个参数,分别是 对象和类
print(isinstance(s,Foo))
print(type(s) == Son) #精准判断
print(type(s) == Foo)
输出结果:
True
True
True
False
4.issubclass
issubclass: 判断一个类是不是另一个类的子类,传两个参数,分别是子类和父类
class Foo:
pass
class Son(Foo):
pass
s = Son() #实例化
print(issubclass(Son,Foo)) #判断一个类是不是另一个类的子类,传两个参数,分别是子类和父类
print(issubclass(Son,object))
print(issubclass(Son,Son))
print(issubclass(Foo,object))
print(issubclass(Foo,Son))
输出结果:
True
True
True
True
False
5.logging模块
logging的作用:1.不需要逐行注释 2.规范格式
设置方式:
1.config
2.logger对象
日志的级别等级: dubug,info,warning,error,critical
logging:实操练习


import logging logging.basicConfig( level = logging.DEBUG, #设置级别为debug format = '%(name)s %(asctime)s [%(lineno)d]--%(message)s', datafmt = '%Y-%m-%d %H-%M%S‘, ) logging,debug('debug') logging.info('info) logging.warning('出错了!') #debug和info 是默认不会打印,等级太低, #这里因为上面降低了级别,所以结果才能显示出来。 输出结果: root 2017-08-18 16-34-24 [34]-- debug root 2017-08-18 16-34-24 [35]-- info root 2017-08-18 16-34-24 [36]-- 出错了
输出结果:
root 2017-08-18 17-01-40 [52]-- 出错了
注意:
执行之后,会生成一个logging 文件,里面会又记载。(即又在屏幕输出,又在文件里生成)
logger对象:解决即在屏幕输出,又在文件里生成,像上面一种仅能在屏幕输出打印,而不能在文件里生成。


import logging def my_logger(): logger = logging.getLogger() file_handler = logging.FileHandler('logging',ending = 'utf-8') stream_handler = logging.StreamHandler() formatter = logging.Formatter(fmt = '%(name)s %(asctime) [%(lineno)d]--%(message)s' , datefmt = '%Y-%m-%d- %H-%M-%S') #设置输出格式,可有可无 file_handler.setFormatter(formatter) #文件流 stream_handler.setFormatter(formatter) #屏幕流 logger.addHandler(file_handler) logger.addHandler(stram_handler) return logger logger = my_logger() logger.warning('出错了')
2.logger对象,可以限制是就屏幕输出,还是在文件里生成。 logger可以灵活的运用。


import logging def my_logger(filename,file = True, stream =True): logger = logging.getLogger() formatter = logging.Formatter(fmt = '%(name)s %(asctime)s [%(lineno)d]-- %(message)s',datefmt='%Y-%m-%d %H-%M-%S') logger.setLevel(logging.DEBUG) #指定日志打印的等级 if file: file_handler = logging.FileHandler('logging',encoding='utf-8') file_handler.setFormatter(formatter) #文件流 logger.addHandler(file_handler) if stream: stream_handler=logging.StreamHandler() stream_handler.setFormatter(formatter) #屏幕流 logger.addHandler(stream_handler) return logger logger = my_logger('logging',file = False) #限制在文件里生成。只在屏幕输出。 logger.warning('出错了') logger.debug('debug')
输出结果:
root 2017-08-18 17-04-00 [72]-- 出错了
root 2017-08-18 17-04-00 [73]-- debug
注意:
这里是切到文件 logging 里 是没有记载的。因为给 False 了。
二:反射
反射:要求掌握 (多用在网络相关方面)。定义:可以用字符串的方式去访问对象的属性,调用对象的方法。
常用:
hasattr:
getattr:
hasattr和getattr通常是一起用的。一个检测,一个获取。
class Black_one:
feature = 'ugly'
def __init__(self,name,addr):
self.name = name
self.affr = addr
def sell_house(self):
print('%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不是傻逼呢?'%self.name)
def rent_house(self):
print('%s 黑中介介绍租房子啦,傻逼才租啊'%self.name)
b1 = Black_one('天地三清','道法无常')
#检测是否含有属性
print(hasattr(b1,'name'))
print(hasattr(b1,'sell_house'))
#获取属性
n = getattr(b1,'name')
print(n)
func = getattr(b1,'sell_house')
func()
print(getattr(b1,'aaaa','不存在'))
输出结果:
True
True
天地三清
天地三清 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不是傻逼呢?
不存在
不常用:
setattr:
#设置属性(新增)
print(b1.__dict__)
setattr(b1,'SB',True)
setattr(b1,'time','1年')
print(b1.__dict__)
输出结果:{'name': '天地三清', 'addr': '道法无常'}
{'name': '天地三清', 'addr': '道法无常', 'SB': True, 'time': '1年'}
delattr:
delattr(b1,'addr')
delattr(b1,'time')
print(b1.__dict__)
输出结果:
{'name': '天地三清', 'addr': '道法无常', 'SB': True, 'time': '1年'}
{'name': '天地三清', 'SB': True}
内置方法:
str and repr
class Foo:
def __init__(self,name):
self.name = name
def __str__(self):
return '%s obj info in str'%self.name
def __repr__(self):
return 'obj info in repr'
f = Foo('egon')
print(f)
print('%s'%f)
print('%r'%f)
输出结果:
egon obj info in str
egon obj info in str
obj info in repr
-del-: 如果没有手动删除,系统默认最后会del。
class Foo:
def __del__(self):
print('执行我啊!')
f = Foo()
print(123)
print(123)
print(123)
del f
print(123)
print(123)
print(123)
输出结果:
123
123
123
执行我啊!
123
123
123
item 系列:
class Foo:
def __init__(self):
self.l = [1,2,3]
def __getitem__(self, item):
return self.l[item]
f = Foo()
print(f[0])
print(f[1])
print(f[2])
输出结果:
1
2
3
class Foo:
def __init__(self,name):
self.name = 'aray'
self.age = 12
self.name = name #这里对应的是下边的实例化所传的值,这个覆盖了上面的‘aray’。
def __getitem__(self, item):
return self.__dict__[item]
f = Foo('zbk')
print(f.__dict__)
输出结果:
{'name': 'zbk', 'age': 12}
class Foo:
def __init__(self,name):
self.name = 'aray'
self.age = 12
self.name = name
def __setitem__(self, key, value): #设置值
self.__dict__[key] = value
f = Foo('zbk')
f['name'] = 'alex'
f['age'] = 12
print(f.__dict__)
输出结果:
{'name': 'alex', 'age': 12}
class Foo:
def __init__(self,name):
self.name = 'aray'
self.age = 12
self.name = name
def __setitem__(self, key, value):
self.__dict__[key] = value
def __delitem__(self, key): #删除的方法
self.__dict__.pop(key)
f = Foo('zbk')
f['name'] = 'alex'
f['age'] = 12
print(f.__dict__)
del f['age']
print(f.__dict__)
输出结果:
{'name': 'alex', 'age': 12}
{'name': 'alex'}
__new__:
class A:
def __init__(self):
self.x = 1
print('in init function')
def __new__(cls, *args, **kwargs):
print('in new function')
return object.__new__(A, *args, **kwargs)
a = A()
print(a.x)
__call__:
对象后面加括号,触发执行。
注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
class Foo:
def __init__(self):
pass
def __call__(self, *args, **kwargs):
print('__call__')
obj = Foo() # 执行 __init__
obj() # 执行 __call__
__len__:
class A:
def __init__(self):
self.a = 1
self.b = 2
def __len__(self):
return len(self.__dict__)
a = A()
print(len(a))
__hash__:
class A:
def __init__(self):
self.a = 1
self.b = 2
def __hash__(self):
return hash(str(self.a)+str(self.b))
a = A()
print(hash(a))
__eq__:
class A:
def __init__(self):
self.a = 1
self.b = 2
def __eq__(self,obj):
if self.a == obj.a and self.b == obj.b:
return True
a = A()
b = A()
print(a == b)