相关概念:
静态属性:定义在类中、__init__外的属性
动态属性:定义在__init__中的属性
私有属性:以__开头的属性
类方法:@classmethod,把一个方法变成一个操作类的方法,不依托于对象,可以直接被类调用。比如修改静态属性。有一个固定的参数cls。
class Goods(object): discount = 1 def __init__(self, name, price): self.name = name self.price = price * self.discount @classmethod def change_discount(cls, new_discount): cls.discount = new_discount Goods.change_discount(0.8) potato = Goods("potato", 100) print(potato.price)
静态方法:@staticmethod,在完全面向对象的程序中,如果一个函数既和对象没有关系,又和类没有关系,就把这个函数变成一个静态方法,可以通过类名点这个方法执行。没有默认的参数。
class Login(object): def __init__(self, user, pwd): self.user = user self.pwd = pwd def login(self): pass @staticmethod def get_usr_pwd(): user = input("请输入用户名") pwd = input("请输入密码") Login(user, pwd) Login.get_usr_pwd()
@property:可以让一个方法变成属性。
面向对象三大特性:封装、继承、多态
一、封装
封装就是将内容封装到某个地方,以后需要使用时去这个地方调用。
应用:Flask中的RequestContext
二、继承
子类可以使用父类中中的属性和方法,减少重复。
应用:restframework视图函数
重写父类中的方法:
class Base(object): def __init__(self,name): self.name = name def run(self): print(self.name + "正在跑") class Son(Base): def run(self): #方式一 Base.run(self) #方式二 super(Son,self).run()
继承的顺序:
在新式类中,类继承的顺序是广度优先,在经典类中继承的顺序是深度优先。
三、多态
多态指的是一类事物具有多种形态,一个类所实例化出的对象就是这个类的多种形态。
在java中传递参数需要指定所需数据的数据类型,但是有的时候并不确定我要传递的数据类型,比如一个函数要传递一个男人对象或者是一个女人对象,但不确定具体是哪个,这个时候就可以定义一个人类,让男人类和女人类都继承这个人类,这样我在函数中只要指定所需的数据类型是人类,我就可以传递男人类或者女人类了。这是多态的应用
在python中是天生支持多态的,因为python所有的类都在源头继承了object对象,所以在python中对数据类型并不敏感,只要一个类中定义了我将要调用的属性或方法,那么我就可以传递这个类当做参数而不用去在意这个类的数据类型。所以python是处处有多态的。
举例:创建两个类,猫类和狗类,都定义一个run方法,一个打印猫在跑,一个打印狗在跑。定义一个函数,传入一个对象,执行这个对象的run方法。猫类和狗类都可以传入,他们都有run方法,但是得到了不同的结果。