码迷,mamicode.com
首页 > 其他好文 > 详细

Day9 面向对象高级

时间:2017-05-12 16:34:33      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:hid   sel   one   自动   demo   开发   自动调用   icm   date   

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 time
class 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 面向对象高级

标签:hid   sel   one   自动   demo   开发   自动调用   icm   date   

原文地址:http://www.cnblogs.com/python-machine/p/6846046.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!