|
314 | 314 |
|
315 | 315 |
|
316 | 316 | # ----------------遍历操作,恢复迭代器初始值------------------------- |
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 |
339 | 506 |
|
340 | 507 | 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() |
356 | 510 |
|
357 | | -# for i in p: |
358 | | -# print(i) |
359 | 511 |
|
360 | | -# 可迭代对象或迭代器肯定可以for in,但是可以for in 不一定是可迭代对象或迭代器 |
361 | | -from collections.abc import * |
| 512 | +# 语法糖装饰器 函数装饰器:@check 类装饰器:@Check |
| 513 | +# @check |
| 514 | +# @Check |
| 515 | +def publish_novels(): |
| 516 | + print("发说说") |
362 | 517 |
|
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 | 518 |
|
| 519 | +# 函数装饰器 |
| 520 | +# publish_novels = check(publish_novels) |
| 521 | +# 类装饰器 |
| 522 | +publish_novels = Check(publish_novels) |
| 523 | +publish_novels() |
371 | 524 | ''' |
372 | 525 | 内置特殊方法 |
373 | 526 | 1.生命周期方法[链接过去] |
|
0 commit comments