首页 > 代码库 > Day9 面向对象高级

Day9 面向对象高级

1.Property

技术分享

技术分享
如下代码演示:  import math  class Circle:   def __init__(self,radius):    self.radius = radius   def area(self):    return math.pi*self.radius*self.radius   def long(self):    return 2*math.pi*self.radius   long = property(long) #也可以在方法上加@property的方式实现,效果都是一样的     circle = Circle(5)  print(circle.area())  print(circle.long)   #注意:以上是经典类的访问方式,下面是新式类的访问方式,如下所示:  # ############### 定义 ###############  class Goods(object):   @property   def price(self):    print(@property)   @price.setter   def price(self, value):    print(@price.setter)   @price.deleter   def price(self):    print(@price.deleter)  # ############### 调用 ###############  obj = Goods()  obj.price          # 自动执行 @property 修饰的 price 方法,并获取方法的返回值  obj.price = 123    # 自动执行 @price.setter 修饰的 price 方法,并将  123 赋值给方法的参数  del obj.price      # 自动执行 @price.deleter 修饰的 price 方法
代码演示

技术分享

技术分享
 例子:  class Foo:   def get_bar(self):    return alex   # 必须两个参数   def set_bar(self, value):    print("ada")    return set value + value   def del_bar(self):    return haoa   BAR=property(get_bar, set_bar, del_bar, description...)  obj = Foo()  print(obj.BAR)  # 自动调用第一个参数中定义的方法:get_bar  obj.BAR = "alex" # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入  print(obj.BAR.__doc__)  # 自动获取第四个参数中设置的值:description...  del Foo.BAR  # 自动调用第三个参数中定义的方法:del_bar方法
代码演示

 

2.静态方法

技术分享

技术分享
import timeclass Date:    def __init__(self,year,month,day):        self.year=year        self.month=month        self.day=day    @staticmethod    def now(): #用Date.now()的形式去产生实例,该实例用的是当前时间        t=time.localtime() #获取结构化的时间格式        return Date(t.tm_year,t.tm_mon,t.tm_mday) #新建实例并且返回    @staticmethod    def tomorrow():#用Date.tomorrow()的形式去产生实例,该实例用的是明天的时间        t=time.localtime(time.time()+86400)        return Date(t.tm_year,t.tm_mon,t.tm_mday)a=Date(1987,11,27) #自己定义时间b=Date.now() #采用当前时间c=Date.tomorrow() #采用明天的时间print(a.year,a.month,a.day)print(b.year,b.month,b.day)print(c.year,c.month,c.day)
代码演示

 

3.类方法

技术分享

技术分享
class Dog(object): def __init__(self,name):  self.name = name @classmethod def eat(self): #注意:当在该方法上加了@classmethod之后就不应该有self了  print("%s is eating" % self.name)  #d = Dog("ChenRonghua")d.eat()  #上面代码会报错,   class Dog(object): name = "张三" #name定义在这里是可以被访问的 def __init__(self,name):  self.name = name @classmethod  # def eat(self):  print("%s is eating" % self.name)  #d = Dog("ChenRonghua")d.eat()
源码演示

 

4.其它特殊方法:

技术分享

技术分享

技术分享
class Foo(object): def __init__(self,name):  self.name = name def __getitem__(self, key):  print(__getitem__, key)  print(self.__dict__)  #self.key 这种方式会报错,因为传过来的是 k1,它会去当前对象的字典中去查找,直接这么self.k1是查不到的,  # 需要通过self.__dict__.k1就可以查到了,注意:在字典中查东西要用中括号的形式!  print(self.__dict__[key]) def __setitem__(self, key, value):  print(__setitem__, key, value)  self.__dict__[key] = value  #设置新值 def __delitem__(self, key):  print(__delitem__, key)  self.__dict__.pop(key)obj = Foo("李四")result = obj[name]  # 自动触发执行 __getitem__obj[name] = alex  # 自动触发执行 __setitem__result = obj[name]  # 自动触发执行 __getitem__del obj[name]
View Code

技术分享

技术分享
 那么,创建类就可以有两种方式:  1.普通方式   class Foo(object):  def func(self):   print(hello alex)  2.特殊方式    Demo01:   def func(self):   print(hello wupeiqi)  Foo = type(Foo, (object,), {func: func})  Foo.func(Foo())  # type第一个参数:类名  # type第二个参数:当前类的基类  # type第三个参数:类的成员   Demo02:   def func(self):   print("hello %s"%self.name)  def __init__(self,name,age):   self.name = name   self.age = age  Foo = type(Foo,(object,),{func:func,__init__:__init__})  f = Foo("jack",22)  f.func()
View Code

技术分享

5.面向对象的软件开发

技术分享

 

Day9 面向对象高级