咸糖记录编程的地方

Do what you love and the money will follow.

目录
cook book 类与对象 4
/  

cook book 类与对象 4

#8.15 属性的代理访问
代理模式
主要思想是将一个对象转换给另一个对象操作

class A:
    def spam(self,x):
        print(x)

    def foo(self):
        print(1)

class B1:
    def __init__(self):
        self._a=A()

    def spam(self,x):
        return self._a.spam(x)

    def foo(self):
        return self._a.foo()

这是一个最简单的代理 在被代理对象方法较少的情况下

class B2:
    def __init__(self):
        self._a=A()

    def bar(self):
        pass

    def __getattr__(self, name):
        return getattr(self._a,name)

如果需要大量方法进行代理 就需要使用到__getattr__方法
__getattr__魔法主要用于对象找不到对应的属性时候 会调用getattr

class B2:
    def __init__(self):
        self._a=A()

    def bar(self):
        pass

    def __getattr__(self, name):
        return getattr(self._a,name)

b=B2()

b.bar()
b.spam(42)

getattr 对双下划线开头的魔法方法不适用

class ListLike:

    def __init__(self):
        self._items=[]

    # def __len__(self):
    #     return len(self._items)

    def __getattr__(self, item):
        return getattr(self._items,item)


a=ListLike()
a.append(2)
a.insert(0, 1)
a.sort()
len(a)


#Traceback (most recent call last):
  File "C:/Users/战神皮皮3迪/PycharmProjects/cookbook/ClassAndInstance/cookbook4.py", line 93, in <module>
    len(a)
TypeError: object of type 'ListLike' has no len()

##8.16 在类中定义多个构造器
可以使用类方法实现构造器

import time
from  time import localtime

class Date:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day

    @classmethod
    def today(cls):
        t=time.localtime()
        return cls(t.tm_year,t.tm_mon,t.tm_mday)

a=Date(2012,12,21)
b=Date.today()
print(b.year)
print(b.month)
print(b.day)

##创建不调用init 方法的实例

from  time import localtime
class Date:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day

d=Date.__new__(Date)
t=localtime()
d.year=t.tm_year
print(d)
print(d.year)

标题:cook book 类与对象 4
作者:xiantang
地址:http://xiantang.info/articles/2019/06/03/1559551068742.html

评论