python类与对象

1、面向过程与面向对象

1.1、面向过程

什么是面向过程呢?

python类与对象

面向过程简而言之可以理解为面向解决步骤,比如:今天你要去新公司上班了,今天你要入职上班的步骤顺序就是面向过程。

1、带着身份证和录用通知单去前台报道。
2、前台核实了你的通知单带着你去找领导。
3、领导看着系统中你的信息,带你去找部门领导。
4、部门领导看了看你,安排你的组长带你。
5、你的组长安排了一个新师傅带你。
6、新师傅询问了你的技能,将公司的代码拷贝给你,让你熟悉。
7、你正式开始了你的工作。

从这一过程不难看出,面向过程是自上而下,逐步进行的,每一步都与前一步相关。

1.2、面向对象

对比于面向过程,面向对象就较为抽象了。

面向对象就是把一切事物看作一个个实体,实体的信息就是属性,实体的动作就是方法。

比如说:每个人就是一个个实体,我们的名字、性别、年龄等是固有的属性。我们的吃饭、走路、上班等是动作,也即方法。

所谓的面向对象就是模拟我们人类在真实环境中的境况。

因此面向对象的核心就是,先找到有哪些实体,然后找到与实体相匹配的动作

如面向过程的例子;

1、实体有:我本人、公司、领导等。
2、信息(属性):
我:名字、性别、技能等。
公司:公司名、成立时间、主营业务等。
领导:领导名、领导负责的部门。
2、动作有:
我:报道、工作。
公司:招聘、提供就业岗位。
领导:工作、分配部门等。

面向对象就是拥有属性的不同实体,执行各自动作的过程。

2、类与对象

拥有相同(或者类似)属性和行为的对象都可以抽像出一个类。类的实例就是对象。类定义了对象都有的属性和行为。

语法:

class Types():
    pass

类用class关键字标识,后面跟 类名(): ,这里的类名一般要见名知意且首字母大写。类中的逻辑在新的一行,并且使用缩进。

类的对象是什么呢?

T = Types()

这就是类的对象,也叫类的实例。

class Types():
    pass

T = Types()
print(T)
print(type(T))

2.1、属性

使用变量来存储信息,这个变量就是其属性(或者叫字段)。

class Types():
    pass

T = Types()
T.name = "XiaoLi"
print(T.name)

2.2、方法

类中的函数就是方法。

class Types():
    pass
    def test1(self):
        print("test1")
T = Types()
T.test1()

注意:类中的函数必须添加一个self,这个self就是对象本身,用以指代自己。当然,你也可以不叫self,但第一个参数必须为其本身。

不带这个参数会报错。

若有其它参数,直接放置于self后面即可。

class Types():
    pass
    def test1(self,a,b):
        print("test1",a,b)
T = Types()
T.test1(1,2)

既然,self指代了对象本身,我们可以在函数中输出这个对象的属性。

class Types():
    pass
    def test1(self,a,b):
        print("test1",a,b)
    def print_name(self):
        print(self.name)
T = Types()
T.name = "XiaoLi"
T.print_name()

这里的self.name,其实就是T.name。

2.3、init函数

既然有属性,有方法,我的属性只能在对象化后添加吗?

当然不是,我们可以在对象化时同步添加。

Python的init函数就是专门来初始化这一过程的,其在Python内部已经写好,实例化类时自动执行init。

class Types():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def test1(self,a,b):
        print("test1",a,b)
    def print_name(self):
        print(self.name,self.age)
T = Types("XiaoLi",20)
T.print_name()

3、类的继承

若两个类之间有共性,即:存在相似的属性和相似的方法。我们可以以其中一个类为模板,另一个类仿照这个类去简化代码。

class Father():
    def __init__(self,name,age,time,company):
        self.name = name
        self.age = age
        self.time = time
        self.company = company
    def go_work(self):
        print(f"上班时间是:{self.time}")
    def go_company(self):
        print(f"去的公司是:{self.company}")
    def name_age(self):
        print(f"目前对象的名字:{self.name},目前对象的年龄:{self.age}")

class Child(Father):

    def __init__(self,name,age,time,company,money):
        super().__init__(name,age,time,company)
        self.money = money
    def print_money(self):
        print(f"孩子的储蓄为{self.money}")

child = Child("Boy",20,"早上9点","腾讯",3000)
child.go_work()
child.go_company()
child.name_age()
child.print_money()

比如这个例子,孩子和父亲都有名字、年龄、上班时间和公司,只不过孩子多了个储蓄的属性。如果孩子类重新开始写,那任务量是非常大的,而孩子类中前四个属性和方法在父亲类中已经写好,因此孩子类直接继承父亲类即可。

注意:super方法是孩子类执行父类的__init__方法。

因此继承就是:若已有类实现了自己类的某些方法,自己类就不必再写了,直接复用已有类的方法。剩下的,专注于实现自己类的其它方法。

4、类的多态

所谓多态指的是允许不同类的对象对同一消息作出响应。换句话说,多态允许一个接口(或方法)被多个类型的实例所实现,并且可以在运行时动态地绑定到这些实例上。

class Father():
    def __init__(self,name,age,time,company):
        self.name = name
        self.age = age
        self.time = time
        self.company = company
    def go_work(self):
        print(f"上班时间是:{self.time}")
    def go_company(self):
        print(f"去的公司是:{self.company}")
    def name_age(self):
        print(f"目前对象的名字:{self.name},目前对象的年龄:{self.age}")
    def happy(self):
        print("父亲爱打篮球")
class Child(Father):

    def __init__(self,name,age,time,company,money):
        super().__init__(name,age,time,company)
        self.money = money
    def print_money(self):
        print(f"孩子的储蓄为{self.money}")

    def happy(self):
        print("儿子爱打游戏")

def people_happy(people):
    people.happy()

father = Father("Bigboy",40,"早上8点50","阿里")
child = Child("Boy",20,"早上9点","腾讯",3000)
people_happy(father)
people_happy(child)

实际上多态利用到了类的继承和重写

类的重写优先从本类中寻找,如果找不到会从父类中找,依次方法直到找不到,报错。

版权声明:如无特殊标注,文章均来自网络,本站编辑整理,转载时请以链接形式注明文章出处,请自行分辨。

本文链接:https://www.shbk5.com/dnsj/76449.html