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