• Python面向对象(全套)


    前言

    编程思想分为面向对象和面向语言

    什么是面向过程?

    面向过程即以事物发生过程为主要目标进行编程(什么正在发生)

    什么是面向对象?

    面向对象即把一件事物为对象进行编程,每个对象都有属性和方法。

    例如:人可以作为对象,属性有姓名、年龄、身高...方法有走、跑、跳...

    车可以作为对象,属性有轮胎、车灯,方向盘...方法有载人、放音乐...

    Python也支持面向对象的三大特征:封装、继承、多态

    类和对象

    类:是对一些具有相同特征和行为的事物的分类,它是抽象的

    对象:它是类的实例化,是具体的

    类与对象的关系即模板与产品:模板只能有一个,但对象可以有很多个

    我们通常用大驼峰命名法去命名一个类名

    类的详解

    Python中定义类有两种:旧式类新式类

    在早期Python中,类不会默认继承object,而没有继承object的类为旧式类。而在python3之后,类会默认继承object类,继承了object的类为新式类

    旧式类:

    1. class A:
    2. pass

    新式类:

    1. class B(object):
    2. pass

    现在一般都使用新式类

    属性

    在Python中类中的属性分为两种:公有属性私有属性

    公有属性:可以在类内类外使用,没有限制

    私有属性:只能在类内使用,但可以使用方法间接访问

    私有属性定义时需在前面加上两个下划线(__)

    1. class A(object):
    2. #公有属性
    3. a = "public"
    4. #私有属性
    5. __b = "private"
    6. print("属性为"+a)
    7. print("属性为"+__b)
    8. test = A()

    属性为public
    属性为private

    方法

    在Python中类中的方法分为两种:公有方法私有方法

    公有方法:可以在类内类外使用,没有限制

    私有方法:只能在类内使用

    私有属性定义时需在前面加上两个下划线(__)

    1. class A(object):
    2. def public(self):
    3. print("公有方法")
    4. def __private(self):
    5. print("私有方法")
    6. test = A()
    7. test.public()
    8. test._A__private()

    公有方法
    私有方法

    Python中访问私有方法可以通过:实例化类._类__私有化方法

    类中内置方法(魔法函数)

    Python的类中以__XX__命名的方法都是类中的内置方法即魔法函数

    如何查看类中的内置函数:

    print(dir(object))

    ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

    类中常用的内置方法:

    1、__init__对象初始化时,会被自动调用

    可以使用__init__方法来控制对象初始化的过程

    1. def __init__(self,name,age,sex):
    2. self.name = name
    3. self.age = age
    4. self.sex = sex

    2、__new__创建对象时,会被自动调用

    3、__del__对象被从内存中销毁前,会被自动调用

    4、__str__返回对象的描述信息,print函数输出使用

    1. class Animal(object):
    2. def __init__(self,name,age,sex):
    3. self.name = name
    4. self.age = age
    5. self.sex = sex
    6. def __str__(self):
    7. return "name = "+ self.name +""
    8. a = Animal("dog","2years","man")
    9. print(a)

    name = dog

    在使用__str__方法后用print函数去输出实例化对象时会输出__str__函数中给定的描述信息(属性为私有化也可被输出)

    面向对象的三大特征

    封装 继承 多态

    封装

    • 将属性和行为作为一个整体,表现生活中的事物
    • 将属性和行为加以权限控制

    在Python中定义类时,我们都需要将属性私有化,如何提供公开的方法去供外部访问和修改

    1. class Animal(object):
    2. def __init__(self,name,age,sex):
    3. self.__name = name
    4. self.__age = age
    5. self.__sex = sex
    6. a = Animal("dog","2years","man")

    此例子中的属性都为私有属性,那我们如何去访问?

    第一种封装方式:

    在类中提供get方法和set方法供外部访问

    1. class Animal(object):
    2. def __init__(self,name,age,sex):
    3. self.__name = name
    4. self.__age = age
    5. self.__sex = sex
    6. #提供公开的get方法
    7. def get_name(self):
    8. return self.__name
    9. #提供公开的set方法
    10. def set_name(self,name):
    11. self.__name = name
    12. a = Animal("dog","2years","man")
    13. print(a.get_name())
    14. a.set_name("cat")
    15. print(a.get_name())

    dog

    cat

    第二种封装方式:

    使用porperty()函数,使用此函数的时候需要有get方法和set方法

    1. class Animal(object):
    2. def __init__(self,name,age,sex):
    3. self.__name = name
    4. self.__age = age
    5. self.__sex = sex
    6. #提供公开的get方法
    7. def get_name(self):
    8. return self.__name
    9. #提供公开的set方法
    10. def set_name(self,name):
    11. self.__name = name
    12. name = property(get_name,set_name)
    13. a = Animal("dog","2years","man")
    14. print(a.name)
    15. a.name = "cat"
    16. print(a.name)

    dog
    cat

    注意:在类外修改属性时a.后需要跟接受property的变量

    第三种封装方式:

    通过装饰器@property在get方法上进行装饰

    1. class Animal(object):
    2. def __init__(self,name,age,sex):
    3. self.__name = name
    4. self.__age = age
    5. self.__sex = sex
    6. @property
    7. def name(self):
    8. return self.__name
    9. @name.setter
    10. def name(self,name):
    11. self.__name = name
    12. a = Animal("dog","2years","man")
    13. print(a.name)
    14. a.name = "cat"
    15. print(a.name)

    dog
    cat

    继承

    类与类之间还有种关系,即继承

    继承可以提高代码的利用率、复用率

    object为所有类的父类,Python支持多继承class Son(father1,father2......),在多继承中需要注意继承顺序,在继承时它会按照继承顺序来继承,即优先级

    1. class father(object):
    2. def __init__(self):
    3. self.money =100
    4. self.home = "房子"
    5. def tell(self):
    6. print("ok")
    7. #儿子继承了父亲
    8. class son(father):
    9. pass
    10. if __name__ == '__main__':
    11. a = son()
    12. a.tell()
    13. print(a.money)
    14. print(a.home)

    ok
    100
    房子

    注意:子类可以继承父类的所有公有属性公有方法

    在子类继承父类后,父类中的方法不能满足子类的使用时,我们可以在子类中进行方法重写

    方法重写时,子类与父类的方法名称、参数必须相同

    在Python中有方法的重写,但是没有方法重载,但是可以实现方法的重载(装饰器)

    方法重写示例:

    1. class father(object):
    2. def tell(self):
    3. print("我喜欢平平淡淡")
    4. #儿子继承了父亲
    5. class son(father):
    6. def tell(self):
    7. print("我喜欢赚钱")
    8. if __name__ == '__main__':
    9. a = son()
    10. a.tell()

    我喜欢赚钱

    super()关键字:它相当于一个指针,默认指向指针

    1. class father(object):
    2. def tell(self):
    3. print("我喜欢平平淡淡")
    4. #儿子继承了父亲
    5. class son(father):
    6. def tell(self):
    7. print("我喜欢赚钱")
    8. def test(self):
    9. self.tell()
    10. super().tell()
    11. if __name__ == '__main__':
    12. a = son()
    13. a.test()

    我喜欢赚钱
    我喜欢平平淡淡

    多态

    多态基于继承的基础之上,一个对象的多种实现,即父类引用指向子类实例的现象

    Python是弱数据语言,所以多态在python中显得不太重要,它在定义变量的时候不用声明数据类型,因此支持多态

    1. class father(object):
    2. def tell(self):
    3. print("我是父亲")
    4. #儿子继承了父亲
    5. class son(father):
    6. def tell(self):
    7. print("我是儿子")
    8. #女儿继承了父亲
    9. class daughter(father):
    10. def tell(self):
    11. print("我是女儿")
    12. def test(father):
    13. father.tell()
    14. if __name__ == '__main__':
    15. a = father()
    16. b = son()
    17. c = daughter()
    18. test(a)
    19. test(b)
    20. test(c)

    我是父亲
    我是儿子
    我是女儿

    在例子中通过tell()函数实现了父类引用指向子类实例,完成了一个函数的多种实现

  • 相关阅读:
    吴恩达deeplearning.ai:使用多个决策树&随机森林
    Django-图书管理系统(含源码)
    【线性代数】实对称
    问题:vue2使用watch监视对象属性,但是这个监视只执行了第一次,后面就没反应了
    【数据结构与算法】八大排序(下)剩下四大排序+基数排序的补充.什么,这还拿不下你?
    【Spring Cloud】新闻头条微服务项目:引入ElasticSearch建立文章搜索索引
    C++:读ini文件(附完整源码)
    一台电脑生成两个ssh,绑定两个GitHub账号
    3d虚拟现实数字化展厅给予参观者充分的交互性和空间感
    Java Web 7 JavaScript 7.9 RegExp对象
  • 原文地址:https://blog.csdn.net/Thewei666/article/details/126652501