Python 4 面向对象

相关概念:

静态属性:定义在类中、__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方法,但是得到了不同的结果。

posted @ 2019-05-11 00:33  不可思议的猪  阅读(180)  评论(0编辑  收藏  举报