码迷,mamicode.com
首页 > 编程语言 > 详细

python之面向对象高级编程

时间:2015-05-09 23:39:18      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:

@property:

既能检查参数,又可以用类似属性这样简单的方式来访问类的变量,可以让调用者写出简短的代码

class Student(object):  
#birth是可读写属性(多定义了一个setter的装饰器),而age就是一个只读属性  
    @property  
    def birth(self):  
        return self._birth  
 
    @birth.setter  
    def birth(self, value):  
        self._birth = value  
 
    @property  
    def age(self):  
        return 2014 - self._birth  
  
---------------------------------      
>>>s = Student()  
>>>s.birth = 2000  
>>>s.birth  
2000  
>>>s.age  

 

@classmethod  and @staticmethod

@classmethod 和 @staticmethod都可以让直接以类方式访问某个内置函数

但@classmethod要求的第一个参数为cls(即类自身,而不是实例自身(实例自身用self))
@classmethod 的函数可以在类中继承
 
 
class Date(object):  
    def __init__(self, month, day, year):  
        self.month = month  
        self.day   = day  
        self.year  = year  
 
    @staticmethod  
    def millenium_1(month, day):  
        return Date(month, day, 2000)  
 
    @classmethod  
    def millenium_2(cls, month, day):  
        #cls is an object that holds class itself  
        return cls(month, day, 2000)  
  
class DateTime(Date):  
    def display(self):  
        return "{0}-{1}-{2} - 00:00:00PM".format(self.month, self.day, self.year)  
  
new_year = Date(1, 1, 2013)               
millenium_new_year_1 = Date.millenium_1(1, 1)  
millenium_new_year_2 = Date.millenium_1(1, 1)  
isinstance(new_year, Date) # True  
isinstance(millenium_new_year, Date) # True  
  
datetime1 = DateTime(10, 10, 1990)  
datetime2 = DateTime.millenium_1(10, 10)  
datetime3 = DateTime.millenium_2(10, 10)  
isinstance(datetime1, DateTime) # True  
isinstance(datetime2, DateTime) # False  
isinstance(datetime2, DateTime) # True 

 

 

多重继承

【1】python中如果子类有自己的构造函数,不会自动调用父类的构造函数,如果需要用到父类的构造函数,则需要在子类的构造函数中显式的调用。

【2】如果子类没有自己的构造函数,则会直接从父类继承构造函数,这在单继承(一个子类只从一个父类派生)中没有任何理解上的问题。

         问题:如果是多继承的情况,一个子类从多个父类派生,而子类又没有自己的构造函数,则子类默认会继承哪个父类的构造函数。

【3】子类从多个父类派生,而子类又没有自己的构造函数时,

(1)按顺序继承,哪个父类在最前面且它又有自己的构造函数,就继承它的构造函数;

(2)如果最前面第一个父类没有构造函数,则继承第2个的构造函数,第2个没有的话,再往后找,以此类推。

Mixin简介

和多重继承类似(其实可以把 Mixin 看作多重继承的一种在特定场景下的应用),
但通常混入 Mixin 的类和 Mixin 类本身不是 is-a 的关系,混入 Mixin 类是为了添加某些(可选的)功能。
自由地混入 Mixin 类就可以灵活地为被混入的类添加不同的功能。
class Dog(Mammal, RunnableMixin, CarnivorousMixin):  
    pass  

 

定制类

http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013946328809098c1be08a2c7e4319bd60269f62be04fa000

https://docs.python.org/2/reference/datamodel.html#special-method-names

1. __str__、 __repr__

class Student(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return Student object (name=%s) % self.name
    __repr__ = __str__

>>>print Student(David)
>>>Student(David)
----------------
Student object (name=David)    #__str__
Student object (name=David)    #__repr__

 

2 __getattr__

class Student(object):

    def __init__(self, name):
        self.name = Michael

    def __getattr__(self, attr):
        if attr==score:
            return 99

>>>student = Student(David)
>>>student.name
>>>student.score
>>>print student.grade
---------------
David
99
None    #可以让class只响应特定的几个属性(通过抛出AttributeError的错误)

 

3 __iter__

如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。

class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1 # 初始化两个计数器a,b

    def __iter__(self):
        return self # 实例本身就是迭代对象,故返回自己

    def next(self):
        self.a, self.b = self.b, self.a + self.b # 计算下一个值
        if self.a > 1000: # 退出循环的条件
            raise StopIteration();
        return self.a # 返回下一个值

>>> for n in Fib():
...     print n,
------------------------
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 

 

4 __getitem__

class Fib(object):
    def __getitem__(self, n):
        a, b = 1, 1
        for x in range(n):
            a, b = b, a + b
        return a
-------------------------
>>> f = Fib()
>>> f[0]
1
>>> f[1]
1
>>> f[2]
2
>>> f[10]
89
>>> f[100]
573147844013817084101

 

5 __call__
而且通过callable()函数,我们就可以判断一个对象是否是“可调用”对象

class Student(object):
    def __init__(self, name):
        self.name = name

    def __call__(self):
        print(My name is %s. % self.name)

>>>student = Student(Daivd)
>>>student()
---------------------
My name is David.

 

 

2015-05-09

 

 

 

python之面向对象高级编程

标签:

原文地址:http://www.cnblogs.com/whuyt/p/4491409.html

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