Python_8:面向对象

一、基础知识

1.1 什么是面向对象

编程语言的发展历史:

  • 一代语言:二进制
  • 二代语言:面向机器的语言—汇编语言
  • 三代语言(高级语言):C语言、C++、C#、JAVA、PHP、Python、ruby ……

在高级语言中:

  • C语言:面向过程的思维在编程—细化问题,调用函数实现解决问题

    以一个过程来作为解决问题的方式,这个过程也可以分为多个小过程(函数)

  • 面向对象是相对于面向过程(函数)而言的。

    • 当语言要解决庞大的问题时,面向过程暴露出它的不足之处——世界观:面向过程仅解决了线的问题,没有考虑面的问题。
    • 分类处理,创建世界的过程。

1.2 类和对象

类:对所需问题进行分析得到类别,关键字class来定义

对象:类的一个实例

类是一个抽象概念,是一类事物的总称,而对象是就是实例,是一个真实存在的事物

1.3 定义类

python使用class关键字来定义类,类名称命名规范:遵循是大驼峰法。

class User(object):  # User类。默认class User和class User(object)效果一样,均为定义一个顶级类
					#若User继承了其他类,定义方式为class User(类名)
    # 重写__init__ 初始化方法,该方法用来初始化属性,魔法方法,在构建对象的时候,会自动触发
    # 在构建对象的时候,才能确定对象的属性值,可以将这些值传递进__init__方法中
    def __init__(self, name, age, gender, tel):
        # self.name 是User类的属性,表示用户名称, name是将来构建对象时的值
        self.name = name
        self.age = age
        self.gender = gender
        self.tel = tel

    def show(self):
        print(self.name + "是User类的一员")

    def __str__(self):
        """ 这个魔法方法,在输出对象时调用 """
        return " name = " + self.name + ",age = " + str(self.age) + ", gender = " + self.gender + ", tel = " \
                   + self.tel


if __name__ == '__main__':
    # 创建对象,创建了一个User的对象
    # 传递属性的值,用来初始化属性
    u = User("王", 17, "男", "120")
    print(u)
    # 调用学习的方法
    u.show()

面向对象三大特征:封装

二、封装

广义上的封装指的是,将细节封起来,提供一个公开的,好用的方式让大家使用的过程。

面向对象的封装是特指:

  • 将属性和方法封装到一个类或者多个类中。需要使用的时候,通过对象调用对应的属性或者方法
  • 将类的属性封装(隐藏)起来,提供公开的方法(getter和setter)来访问

python,如果要私有化一个属性 ,在属性前面加上两个下划线 username:__username

2.1 写法一

class User(object):
    def __init__(self, username, password):
        self.__username = username        	#此时__username为私有属性,外部无法访问和修改
        self.__password = password

    def get_username(self):			#公开方法 get_username()可以获取到私有属性__username的值
        return self.__username

    def set_username(self, username):
        self.__username = username

    def get_password(self):
        return self.__password

    def set_password(self, password):
        self.__password = password
        
if __name__ == '__main__':
    user1 = User("王",123)
    print(user1.get_username(), user1.get_password()) 	 #若想获得或修改对象user1的私有属性
    user1.set_username("李")								#此时只能通过公开方法
    user1.set_password(234)
    print(user1.get_username(), user1.get_password())

    
"""
结果:
王 123
李 234
"""

2.2 写法二

property() 函数的作用是在新式类中返回属性值

class User(object):
    def __init__(self, username, password):
        self.__username = username
        self.__password = password

    def get_username(self):
        return self.__username

    def set_username(self, username):
        self.__username = username

    def get_password(self):
        return self.__password

    def set_password(self, password):
        self.__password = password

    username = property(get_username, set_username)		#此处为引用传递
    password = property(get_password, set_password)


if __name__ == '__main__':
    user1 = User("w", 123)
    print(user1.username, user1.password)
    user1.username = "c"		#user1.username触发在property()函数中触发get_username方法
    user1.password = 234
    print(user1.username, user1.password)
    
    
"""
结果:
w 123
c 234
"""

2.3 写法三

将 property 函数用作装饰器

class User(object):
    def __init__(self, username, password):
        self.__username = username
        self.__password = password

    @property							#将username方法转化为同名只读属性的getter方法
    def username(self):
        return self.__username

    @username.setter					#setter方法
    def username(self, username):
        self.__username = username

    @property
    def password(self):
        return self.__password

    @password.setter
    def password(self, password):
        self.__password = password


if __name__ == '__main__':
    user1 = User("w", 123)
    print(user1.username, user1.password)
    user1.username = "c"
    user1.password = 234
    print(user1.username, user1.password)

"""
结果:
w 123
c 234
"""

三、继承

3.1 继承规则

类与类之间也存在一种继承的关系。

继承父类的时候,并不是,所有的属性和方法都会继承,只能继承公开的方法和属性。

class Parent(object):
    def __init__(self):
        self.surname = "王"
        self.hometown = "陕西西安"

    def show(self):
        print("这是父类")


class Children(Parent):
    pass


if __name__ == '__main__':
    user1 = Children()
    print(user1.surname, user1.hometown)
    user1.show()

"""
结果:
王 陕西西安
这是父类
"""

3.2 方法重写\覆盖(override)

在继承基础上,如果子类方法父类的方法不能满足自己使用的时候,那么就重写这个方法

  • 注意:覆盖时:方法名称和参数必须一模一样
class Parent(object):
    def __init__(self):
        self.surname = "王"
        self.hometown = "陕西西安"

    def show(self):
        print("这是父类")


class Children(Parent):
    def show(self):
        print("这是子类")


if __name__ == '__main__':
    user1 = Children()
    print(user1.surname, user1.hometown)
    user1.show()
    
"""
结果:
王 陕西西安
这是子类
"""

Python没有函数重载,有函数重写

3.3 多继承与super

Python支持多继承,一个类有多个父类:但是属性和方法的继承按照广度优先执行——继承的顺序

super关键字

在子类中调用父类的方法或者属性


class Parent(object):
    def __init__(self):
        self.surname = "王"
        self.hometown = "陕西西安"

    def show(self):
        print("这是父类")


class Children(Parent):
    def show(self):
        super().show()			#调用父类的方法show()
        print("这是子类")


if __name__ == '__main__':
    user1 = Children()
    print(user1.surname, user1.hometown)
    user1.show()
    
"""
结果:
王 陕西西安
这是父类
这是子类
"""

class Person(object):
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender


class Employee(Person):
    def __init__(self, name, age, gender, number):
        super().__init__(name, age, gender)			#继承父类的初始化函数
        self.number = number

四、多态

多态:指的就是对象的多种状态。多态是在继承的基础上而言。在面向对象的语言中,父类引用指向子类实例的现象就叫做多态。

  • 在弱数据类型语言中,天生就支持多态。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值