python之面向对象高级编程

@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 的函数可以在类中继承


http://stackoverflow.com/questions/12179271/python-classmethod-and-staticmethod-for-beginner

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


定制类

https://docs.python.org/2/reference/datamodel.html#special-method-names
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值