Skip to content

Commit 745a06e

Browse files
committed
内置特殊方法及装饰器完结
1 parent c7f2735 commit 745a06e

1 file changed

Lines changed: 201 additions & 48 deletions

File tree

python_pro/oop面向对象/内置特殊方法.py

Lines changed: 201 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -314,60 +314,213 @@
314314

315315

316316
# ----------------遍历操作,恢复迭代器初始值-------------------------
317-
class Person:
318-
def __init__(self):
319-
self.res = 1
320-
321-
# 方式一
322-
# def __getitem__(self, item):
323-
# self.res += 1
324-
# if self.res >= 6:
325-
# raise StopIteration("停止遍历")
326-
# return self.res
327-
328-
# 方式二
329-
def __iter__(self):
330-
# 每次迭代重新赋值,使得迭代器重用
331-
self.res = 1
332-
return self
333-
334-
# def __next__(self):
335-
# self.res += 1
336-
# if self.res >= 6:
337-
# raise StopIteration("停止遍历")
338-
# return self.res
317+
# class Person:
318+
# def __init__(self):
319+
# self.res = 1
320+
#
321+
# # 方式一
322+
# # def __getitem__(self, item):
323+
# # self.res += 1
324+
# # if self.res >= 6:
325+
# # raise StopIteration("停止遍历")
326+
# # return self.res
327+
#
328+
# # 方式二
329+
# def __iter__(self):
330+
# # 每次迭代重新赋值,使得迭代器重用
331+
# self.res = 1
332+
# return self
333+
#
334+
# # def __next__(self):
335+
# # self.res += 1
336+
# # if self.res >= 6:
337+
# # raise StopIteration("停止遍历")
338+
# # return self.res
339+
#
340+
# def __call__(self, *args, **kwargs):
341+
# self.res += 1
342+
# if self.res >= 6:
343+
# raise StopIteration("停止遍历")
344+
# return self.res
345+
#
346+
#
347+
# p = Person()
348+
# # 前提是实现了__getitem__方法,才可以使用iter()
349+
# # pt = iter(p.__next__, 4)
350+
# # 实例可以被调用,实现call方法
351+
# pt = iter(p, 4)
352+
# print(pt)
353+
# print(p is pt)
354+
# for i in pt:
355+
# print(i)
356+
#
357+
# # for i in p:
358+
# # print(i)
359+
#
360+
# # 可迭代对象或迭代器肯定可以for in,但是可以for in 不一定是可迭代对象或迭代器
361+
# from collections.abc import *
362+
#
363+
# # 实例成为迭代器条件:写__iter__方法与__next__方法
364+
# # 判断是不是迭代器对象
365+
# print(isinstance(p, Iterator))
366+
# # 判断是不是可迭代对象
367+
# print(isinstance(p, Iterable))
368+
# print(isinstance(pt, Iterator))
369+
# print(isinstance(pt, Iterable))
370+
371+
372+
# ----------------描述器定义方式一-------------------------
373+
# class Person:
374+
# def __init__(self):
375+
# self.__age = 18
376+
#
377+
# @property
378+
# def age(self):
379+
# return self.__age
380+
#
381+
# @age.setter
382+
# def age(self, value):
383+
# if value < 0:
384+
# value = 0
385+
# self.__age = value
386+
#
387+
# @age.deleter
388+
# def age(self):
389+
# del self.__age
390+
#
391+
# num = "jj"
392+
#
393+
#
394+
# person = Person()
395+
# person.age = 10
396+
# print(person.age)
397+
# del person.age
398+
# # print(person.age)
399+
# help(person)
400+
401+
402+
# ----------------描述器定义方式二-------------------------
403+
404+
# class Age(object):
405+
# def __get__(self, instance, owner):
406+
# print("get")
407+
#
408+
# def __set__(self, instance, value):
409+
# print("set")
410+
#
411+
# def __delete__(self, instance):
412+
# print("delete")
413+
#
414+
#
415+
# class Person(object):
416+
# age = Age()
417+
# # def __getattribute__(self, item):
418+
# # print("kkkk")
419+
#
420+
# # 只要新式类才会转换操作描述器
421+
# person = Person()
422+
# person.age = 10
423+
# print(person.age)
424+
# del person.age
425+
# print(person.age)
426+
# help(person)
427+
# 只打印get。不会转换set和delete。所以一般通过实例操作描述器
428+
# print(Person.age)
429+
# Person.age = 20
430+
# del Person.age
431+
432+
433+
# 如果实现了__get__, 判定为"非资料描述器"
434+
# 如果实现了__get__、 __set__,判定为"资料描述器"
435+
# 资料描述器 > 实例字典 > 非资料描述器
436+
# ----------------描述器优先级-------------------------
437+
438+
# class Age(object):
439+
# def __get__(self, instance, owner):
440+
# print("get")
441+
#
442+
# # def __set__(self, instance, value):
443+
# # print("set")
444+
# #
445+
# # def __delete__(self, instance):
446+
# # print("delete")
447+
#
448+
#
449+
# class Person(object):
450+
# age = Age()
451+
#
452+
# def __init__(self):
453+
# self.age = 100
454+
#
455+
#
456+
# # 只要新式类才会转换操作描述器
457+
# person = Person()
458+
# person.age = 10
459+
# print(person.age)
460+
# # del person.age
461+
# print(person.__dict__)
462+
463+
464+
# ----------------描述器值存在问题-------------------------
465+
466+
# class Age(object):
467+
# def __get__(self, instance, owner):
468+
# print("get")
469+
# return instance.v
470+
#
471+
# def __set__(self, instance, value):
472+
# print("set", self, instance, value)
473+
# instance.v = value
474+
#
475+
# def __delete__(self, instance):
476+
# print("delete")
477+
# del instance.v
478+
#
479+
#
480+
# class Person(object):
481+
# age = Age()
482+
#
483+
#
484+
# # 多个实例的age对象相同,通过instance来修改值
485+
# person = Person()
486+
# person.age = 10
487+
# print(person.age)
488+
# # del person.age
489+
# person2 = Person()
490+
# person2.age = 100
491+
# print(person2.age)
492+
# print(person.age)
493+
494+
495+
# ----------------使用类实现装饰器-------------------------
496+
# def check(func):
497+
# def inner():
498+
# print("登录验证")
499+
# func()
500+
#
501+
# return inner
502+
503+
class Check:
504+
def __init__(self, func):
505+
self.func = func
339506

340507
def __call__(self, *args, **kwargs):
341-
self.res += 1
342-
if self.res >= 6:
343-
raise StopIteration("停止遍历")
344-
return self.res
345-
346-
347-
p = Person()
348-
# 前提是实现了__getitem__方法,才可以使用iter()
349-
# pt = iter(p.__next__, 4)
350-
# 实例可以被调用,实现call方法
351-
pt = iter(p, 4)
352-
print(pt)
353-
print(p is pt)
354-
for i in pt:
355-
print(i)
508+
print("登录验证")
509+
self.func()
356510

357-
# for i in p:
358-
# print(i)
359511

360-
# 可迭代对象或迭代器肯定可以for in,但是可以for in 不一定是可迭代对象或迭代器
361-
from collections.abc import *
512+
# 语法糖装饰器 函数装饰器:@check 类装饰器:@Check
513+
# @check
514+
# @Check
515+
def publish_novels():
516+
print("发说说")
362517

363-
# 实例成为迭代器条件:写__iter__方法与__next__方法
364-
# 判断是不是迭代器对象
365-
print(isinstance(p, Iterator))
366-
# 判断是不是可迭代对象
367-
print(isinstance(p, Iterable))
368-
print(isinstance(pt, Iterator))
369-
print(isinstance(pt, Iterable))
370518

519+
# 函数装饰器
520+
# publish_novels = check(publish_novels)
521+
# 类装饰器
522+
publish_novels = Check(publish_novels)
523+
publish_novels()
371524
'''
372525
内置特殊方法
373526
1.生命周期方法[链接过去]

0 commit comments

Comments
 (0)