类:表示一组或者一类对象,每个对象属于特定的类,类主要任务是定义包含其实例的方法。
多态:指能够同样地对待不同类型的类的对象,无需知道对象属于哪个类就可以调用其方法。
封装:指向外部隐藏不必要的细节。无需知道对象的构造就能使用它,
继承:一个类可以是一个或者多个类的子类。子类继承超类的所有方法,可以指定多个超类。
对象:由属性和方法组成。属性是属于对象的变量,而方法是存储在属性中的函数,与其他函数不同是它总是将其所属的对象作为第一个参数,这个参数通常被命名为self(实际上可以随便给这个参数名命名,只是习惯于用self)
类的创建
class Person: def set_name(self, name): self.name = name def get_name(self, name): return self.name def greet(self): print("hello,{}".format(self.name)) foo = Person() #创建对象 foo.set_name('bob') print(foo.greet()) #方法的调用 print(foo.name) #属性的调用
class语句创建独立的命名空间,用于在其中定义函数,self指对象本身。
class语句中定义的代码都是在一个特殊的命名空间(类的命名空间)内执行的,类成员都可以访问这个命名空间,类定义其实就是要执行的代码段。
私有属性不能从对象外部访问,只能通过存取器方法来访问。要让方法或属性变成私有的,只需要让其名称以两个下划线打头即可。此处外部不能访问__inaccessible,而在类中依然可以使用
class Secretive: def __inaccessible(self): #注意双下划线 print("bet you can't see me") def accessible(self): print("the secret message is:") self.__inaccessible()
超类和继承
指定超类,可在class语句中的类名后面加上超类名,并将其用圆括号括起。
也可以继承多个超类,称为多重继承。但是要注意:当多个超类都实现了同一个方法时,必须注意顺序,位于前面的类的方法会覆盖后面类的方法。
class Calc: def calc(self, expression): self.value = eval(expression) class Talk: def talk(self): print('hi,my value is:', self.value) class TalkCalc(Calc, Talk): pass tc = TalkCalc() tc.calc('1+2*3') print(tc.talk())
通过hasattr可以检查所需的方法是否存在,getattr检查属性talk是否可以调用,setatrr设置对象属性,__dic__用于查看对象中存储的所有值。
抽象类
抽象基类用于指定子类必须提供哪些功能,却不实现这些功能。使用模块abc创建抽象基类,Knigget类实例化抽象类:
当创建一个类Herry同样的实现了这个抽象类实例化后的类的方法,也就是Herry类同样的实现了talk方法,这样会造成误解,比如这个talk的方法可能是从另外一个模块中导入的。此时可以使用注册,不从Herry和Talk派生出子类,将Herry注册为Talk,这样所有的Herry对象都被视为Talk对象。但是使用注册的话,直接从抽象类派生提供的保障就没有了。
多态
多态的产生是由于同一个方法由于调用对象的不同而产生不同的行为。
class Man: def eat(self): print("cf") class Chinese(Man): def eat(self): print("chinese eat") class English(Man): def eat(self): print("english eat") def ManEat(m): if isinstance(m, Man): m.eat() else: print("Bunengchifan") ManEat(Chinese()) #由于传入的对象不同所产生的结果也不同 ManEat(English) 输出结果: chinese eat Bunengchifan