美文网首页
Python(四)

Python(四)

作者: 冰菓_ | 来源:发表于2022-04-26 22:54 被阅读0次

    面向对象

    两大编程思想
    面对对象和面对过程
    类和对象的创建

    类是多个类似事物组成的群体的统称.能够帮助我们快速理解和判断事物的性质

    在python中一切皆对象

    class Cat:
        pass
    
    
    print(Cat)
    print(type(Cat))
    print(id(Cat))
    

    def init 在类之外定义的称为函数,在类之内定义的称为方法

    对象的创建又称为类的实例化
    语法是: 实例名 = 类名()

    方法__init__()定义成包含三个形参:self、name和id。在这个方法的定义中,形参self必不可少,而且必须位于其他形参的前面。为何必须在方法定义中包含形参self呢?因为Python调用这个方法来创建Dog实例时,将自动传入实参self。每个与实例相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。

    class Dog:
        # 类属性
        native_num = 1
    
        # 初始化属性
        def __init__(self, name, id):
            self.name = name
            self.id = id
    
        # 实例方法
        def sit(self):
            print('我是实例方法')
    
        # 静态方法
        @staticmethod
        def method():
            print('我是静态方法')
    
        # 类方法
        @classmethod
        def cls(cls):
            print('我是类方法')
    
    
    dog = Dog('小米', 123)
    print(dog)
    print(type(dog))
    print(id(dog))
    
    
    Dog.sit(dog)  # 类名.方法名
    dog.sit()   # 对象名.方法名
    

    对象名.方法名??这个在Java中不是是调用静态方法的吗

    类属性&类方法&静态方法
    1. 类属性:类中方法外的变量称为类属性,被该类的所有对象所共享
    2. 类方法:使用类名直接访问的方法
    3. 静态方法:使用类目直接访问的方法
    动态绑定属性和动态绑定方法
    class Pig:
        native_num = 1
    
        def __init__(self, name, id):
            self.name = name
            self.id = id
    
        def eat(self):
            print(self.name, '吃')
    
    
    pig1 = Pig('A', '100')
    pig2 = Pig('B', '200')
    print(pig1, pig2)
    # 动态绑定参数
    pig1.gender = '公的'
    print(pig1, pig2)
    
    pig1.eat()
    pig2.eat()
    print(pig1.gender)
    
    
    # 动态绑定方法
    
    def ship():
        print('......')
    
    
    pig1.ship = ship
    # pig1.ship,注意要带括号
    pig1.ship()
    

    面对对象的特性

    1. 封装:提高程序的安全性
    2. 继承:提高代码的复用性
    3. 多态:提高程序的可扩展性和可维护性
    封装
    class A:
        def __init__(self,name,id):
            self.name = name
            self.__id = id
    
        def a(self):
            print(self.__id)
    
    
    a1 = A(name='xiaom', id='0001')
    print(a1)
    print(a1.name)
    # print(a1.__id) 无法访问
    
    print(dir(a1))
    # 其实也可以访问
    print(a1._A__id) 
    
    继承

    多继承

    方法重写
    class Animal:
        native_num = 0
    
        def __init__(self, name, uid):
            self.name = name
            self.uid = uid
    
        def eat(self):
            print(self.name)
    
    
    class Person(Animal):
        native_num = 1
    
        def __init__(self, name, uid, gender):
            super().__init__(name, uid)
            self.gender = gender
    
        def info(self):
            print(self.name, 'Person')
    
    
    p = Person('a', 1111, '男')
    p.eat()
    
    
    class Student(Person):
        native_num = 10
    
        def __init__(self, name, uid, gender):
            super().__init__(name, uid, gender)
    
        def info(self):
            super(Student, self).info()
            #  super().info()   
            print(self.name, 'Student')
    
    
    s = Student('s', 111111, '男')
    s.info()
    
    object类

    object类是所有类的父类,因此所有类都有object类的属性和方法,内置函数dir()可以查看指定对象所有属性

    __str__函数的使用,相当于Java中的toString();return要直接返回字符串的

    class A:
        def __init__(self, name, uid):
            self.name = name
            self.uid = uid
    
        def __str__(self):
            return f'{self.name}.....{self.uid}'
    
    
    s = A('小米', '10001')
    print(s)
    
    多态

    即便是不知道一个变量所引用的对象到底是什么类型,仍然可以通过这个变量调用方法,在运行过程中根据变量所引用对象的类型,动态决定调用哪个对象中的方法

    静态语言和动态语言关于多态的区别

    1. 静态语言实现多态的三个必要条件:继承,方法重写,父类引用指向子类对象
    2. 动态语言的多态崇尚"鸭子类型"当看到一只鸟走起来向鸭子,游泳起来像鸭...那么这只鸟就可以被称作鸭子,在鸭子类型中,不需要关心对象是什么类型,到底是不是鸭子,只关心对象的行为
    class Cat:
        def __init__(self, name):
            self.name = name
    
    
        def eat(self):
            print('cat')
    
    
    class Dog:
        def __init__(self, name):
            self.name = name
    
    
        def eat(self):
            print('Dog')
    
    
    def fun(a):
        a.eat()
    
    
    fun(Cat(''))
    fun(Dog(''))
    
    特殊方法&特殊属性
    特殊方法&特殊属性

    注意这里:other.name!!!

    a = 1
    b = 2
    print(a + b)
    print(a.__add__(b))
    
    
    class A:
        def __init__(self, name):
            self.name = name
    
        def __add__(self, other):
            return self.name + other.name
    
    
    a1 = A('AAA')
    a2 = A('AAA')
    print(a1.__add__(a2))
    
    lst = [1, 2]
    print(len(lst))
    
    
    class B:
        def __init__(self, name):
            self.name = name
    
        def __len__(self):
            return len(self.name)
    
    
    b1 = B('BBB')
    b2 = B('bbb')
    print(len(b1))
    
    __new__
    类的浅拷贝和深拷贝

    变量的操作赋值:只是形成两个变量,实际上还是指向同一个对象
    浅拷贝:python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,源对象和拷贝对象引用同一个子对象

    class Name:
        def __init__(self):
            pass
    
    
    class Gender:
        def __init__(self):
            pass
    
    
    class Student:
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
    
    
    name = Name()
    gender = Gender()
    
    student = Student(name, gender)
    
    import copy
    
    student1 = copy.copy(student)
    
    print(id(student), id(student.name), id(student.gender))
    print(id(student1), id(student1.name), id(student1.gender))
    
    '''
    2294896209504 2294896211472 2294896210512
    2294888037440 2294896211472 2294896210512
    
    '''
    

    深拷贝:使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同

    小结
    面对对象小结
    Python编程:从入门到实践(第2版)-埃里克·马瑟斯-微信读书 (qq.com)

    模块和包

    什么叫模块
    模块的导入
    1. python自带模块
    import math  # as ma
    from math import pi
    print(math.pi)
    print(pi)
    
    1. 自己写的模块,在pycharm中要点击sources root
    以主程序方式运行

    在每个模块的定义中都包含一个记录模块名称的变量 __name__,程序可以检查该变量,以确定他们在哪个模块运行.如果一个模块不是被导入其他程序中执行,那么它可能在解释器的顶级模块中执行

    if __name__ == '__main__':
        pass
    
    什么叫包

    包是一个分层次的目录结构,它将一组功能相近的模块组织在一个目录下
    包和目录

    1. 包含__init__,py文件的目录称为bao
    2. 目录里通常不包含__init__,py文件
    常用的内容模块
    常用的内容模块
    第三方模块的安装和使用

    pip install 模块名称


    在pycharm中安装第三方库

    文件操作

    编码格式
    常见的字符编码格式
    文件读写的原理
    IO原理
    文件读写操作
    常用的文件打开模式

    Python常用的文件打开模式

    file = open('a.txt', 'r')
    print(file.readline())
    
    
    file = open('a.txt', 'a')
    file.write('....')
    
    文件对象常用方法

    Python File(文件) 方法 | 菜鸟教程 (runoob.com)

    Python文件基本操作整理 | w3c笔记 (w3cschool.cn)

    上下文管理器

    上下文管理器? - 知乎 (zhihu.com)

    os模块

    Python OS 文件/目录方法 | 菜鸟教程 (runoob.com)

    os.path模块

    Python os.path() 模块 | 菜鸟教程 (runoob.com)

    列出当前目录下的所有py文件

    import  os
    dirs = os.getcwd()
    lst_dirs = os.listdir(dirs)
    for dir in lst_dirs:
        if dir.endswith('.py'):
            print(dir)
    

    流程当前目录下的所有文件

    import os
    dirs = os.getcwd()
    files = os.walk(dirs)
    print(type(files))
    for file in files:
        print(file[0], file[1], file[2])
    
    import os
    import os.path
    dirs = os.getcwd()
    files = os.walk(dirs)
    print(type(files))
    for a, b, c in files:
        for dir in b:
            print(os.path.join(a, dir))
        for file in c:
            print(os.path.join(a, file))
    

    相关文章

      网友评论

          本文标题:Python(四)

          本文链接:https://www.haomeiwen.com/subject/rcoxyrtx.html