一,面向对象编程
1,类和实例,
class Student(object):#括号里面的是继承的类 def __init__(self, name, score):初始化对象时,参数个数 self.name = name self.score = score def print_score(self): print '%s: %s' % (self.name, self.score)
2,访问限制
1,如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__
2,但是如果外部代码要获取name和score怎么办?可以给Student类增加get_name和get_score这样的方法,,好处:可以对参数做检查,避免传入无效的参数:
lass Student(object): def __init__(self, name, score): self.__name = name #双下划线,外部无法直接访问 self.__score = score def print_score(self): print '%s: %s' % (self.__name, self.__score) def set_score(self, score): #通过set_来做筛选 if 0 <= score <= 100: self.__score = score else: raise ValueError('bad score') def get_name(self): #通过get_来获取参数 return self.__name def get_score(self): return self.__score
3,继承和多态
1,继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写;默认继承object
2,有了继承,才能有多态。在调用类实例方法的时候,尽量把变量视作父类类型,这样,所有子类类型都可以正常被接收;如猫,狗等都属于动物,即为一种多态表现
4,获取对象信息
1,type方法;
>>> import types >>> type(int)==types.TypeType True >>> type(int) <type 'type'> >>> type(int)==type(str) True
2,isinstance()方法:>>> isinstance('abc',str) True
3,dir():获取对象所有方法和属性
>>> dir('o1') ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
(二),面向对象编程
1,绑定
对象和类动态绑定属性和方法:
>>> class Student(object): ... pass ... >>> s = Student() >>> s.name = 'Michael' # 动态给实例绑定一个属性 >>> print s.name Michael >>> def set_age(self, age): # 定义一个函数作为实例方法 ... self.age = age ... >>> from types import MethodType >>> s.set_age = MethodType(set_age, s, Student) # 给实例绑定一个方法 >>> s.set_age(25) # 调用实例方法 >>> s.age # 测试结果 25 >>> def set_score(self, score): ... self.score = score ... >>> Student.set_score = MethodType(set_score, None, Student) >>> s.set_score(100) >>> s.score 100 >>> s2.set_score(99) >>> s2.score 99 # 关键方法MethodTypes(方法名,对象(所有为None),类名)