首页 > 代码库 > 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‘]
那么,创建类就可以有两种方式: 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()
5.面向对象的软件开发
Day9 面向对象高级
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。