访问限制
在python中以‘___’(例如:__age)开头的变量为私用成员。注意如果后面也是以双下划线的话(例如:__age__),表示特殊变量特殊变量,其有着特殊用途(__len__()其是在调用len(类对象) 的系统函数时调用的类函数),特殊变量是可以直接在类外访问的。
构造函数
形如一下:
__init__(self,):
继承与多态
python的继承机制与java大同小异。
静态语言 vs 动态语言
对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。
对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了:
class Timer(object):
def run(self):
print(‘Start…’)
这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
Python的“file-like object“就是一种鸭子类型。对真正的文件对象,它有一个read()方法,返回其内容。但是,许多对象,只要有read()方法,都被视为“file-like object“。许多函数接收的参数就是“file-like object“,你不一定要传入真正的文件对象,完全可以传入任何实现了read()方法的对象。
小结
继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。
动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的。
获取对象信息
1.dir(),可以用来获取相关类的成员信息。
In [4]: class A():
...: def __init__(self,):
...: pass
...: def name(self,):
...: print("name")
...:
In [5]: a = A()
In [6]: dir(a)
Out[6]:
['__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'name']
2.isinstance(a,b)方法可以判断a对象是否是b(类名)类,或者是其的子类,返回bool值(亦可以使用type进行类民的获取,以及比较,但是推荐使用isinstance,其可以将指定类型及其子类“一网打尽”)
实例属性和类属性
这一点与java类似,实例对象必须在类实例化为类对象时才可以进行使用,举个例子:
class A():
name="MA"
上面的对象就是类属性,是可以直接通过类名直接调用的(A.name)
class A():
def __init__(self,):
self.name="MA"
用self.声明变量,上面的就是实例属性,其必须在类对象创建成功后才可以进行使用,是不可以直接通过类名调用的。
__slots__ 限制可用于动态拓展的属性
例子:
class A:
__slots__=('age','name')
B= A()
当类外试图通过B.scoure = "XXX"来拓展类时系统将会报错,因为scoure不在__slots__指定的范围,__slots__通过使用tuple来指定可以使用的命名范围的方式限制其可以动态拓展的命名范围。
@property 与 @成员名.setter
在python的类的设计中如果需要限定类成员变量的修改限制可以使用* @property (以指定函数提供的方式读取类成员)
@成员名.setter(以指定的函数方式修改类的成员)
示例:
class Screen(object):
def __init__(self,):
self.__resolution=786432
pass
@property
def width(self,):
return self.__width
@property
def height(self,):
return self.__height
@property
def resolution(self,):
return self.__resolution
@width.setter
def width(self,value):
self.__width = value
@height.setter
def height(self,value):
self.__heigth = value
# 测试:
s = Screen()
s.width = 1024
s.height = 768
print('resolution =', s.resolution)
if s.resolution == 786432:
print('测试通过!')
else:
print('测试失败!')
结果:
resolution = 786432
测试通过!
python支持多重继承
效果与c++相同
使用示例:
class Animal(object):
pass
# 大类:
class Mammal(Animal):
pass
class Bird(Animal):
pass
# 各种动物:
class Dog(Mammal):
pass
class Bat(Mammal):
pass
#多重继承的使用示例
class Dog(Mammal, Runnable):
pass
定制类
1.__len__对应len()方法
2.__str__对应str()方法
3.__iter__对应for … in …
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 > 100000: # 退出循环的条件
raise StopIteration()
return self.a # 返回下一个值