• python之面向对象编程


    01 第一步 创建类, self指向调用该函数的对象 也就是通过类实例出来的对象 
    
    class Person():
        def __init__(self):
            self.name = 'zs'
            self.age = 12
    
        def fn(self):
            print(self)
    
    
    p1 = Person()
    print(p1)  # <__main__.Person object at 0x000002509F331790>
    print(p1.fn())  #  <__main__.Person object at 0x000002509F331790>

    02 一个类可以创建多个实例对象 每个实例对象的指针不同也就是内存地址不同

    p2 = Person()
    
    print(p2) <__main__.Person object at 0x0000022309AD1940>
    
    print(p2.fn()) <__main__.Person object at 0x0000022309AD1940>
    
    p1 = Person()
    
    print(p1) <__main__.Person object at 0x0000022309AD1910>
    
    print(p1.fn()) <__main__.Person object at 0x0000022309AD1910>

    03 添加获取对象的属性  给对象添加私有的属性和方法

    p1 = Person()
    
    p1.sex = '男'
    
    p1.fn1 = lambda : 10
    
    print(p1.fn1())   10
    
    print(p1.sex)  男

    04  类的返回值 通过  __str__来实现

    class Person():
        def __init__(self):
            self.name = 'zs'
            self.age = 12
    
        def fn(self):
            print(self)
    
        def __str__(self):
            return f'{self.name}-{self.age}'
    
    print(Person()) # zs-12 
    
    p1 = Person()
    
    print(p1)  # zs-12

    05 类的__del__属性 当代码被执行完 内存空间被释放掉 就会执行这个方法

    class Person():
        def __init__(self):
            self.name = 'zs'
            self.age = 12
    
        def fn(self):
            print(self)
    
        def __str__(self):
            return f'{self.name}-{self.age}'
    
        def __del__(self):
            print('我被释放了')
    
    Person() #  我被释放了

    06 案例 之 地瓜的类 

    class Digua():
        def __init__(self):
            self.time1 = 0
            self.status = '生' # 0 生  1-10 未熟  11-20 快熟  20以上 熟了
            self.list = [] # 需要添加的材料
    
        def addTime(self,time):
            self.time1+=time
            if self.time1 == 0:
                self.status = '生'
            elif 0 
    
    07 类的继承 
    
    class A():
        def __init__(self):
            self.name ='zs'
    
    class B(A):
        pass
    
    c = B()
    print(c.name) # zs 

    08  类的属性和方法的覆盖 , 如果同时继承多个父类,有重名的打印的是第一个父类

    class A():
        def __init__(self):
            self.name = 'zs'
    
        def fn(self):
            print('我是A')
    
    
    
    class B():
        def __init__(self):
            self.name = 'ls'
    
        def fn1(self):
            print('我是B')
    
    
    class C(A,B):
        pass
    
    
    
    c = C()
    print(c.name) # zs 

    09 自用拥有的属性和方法与父级重名以自身的为主

    class A():
        def __init__(self):
            self.name = 'zs'
    
    
    class B(A):
        def __init__(self):
            self.name = 'ls'
    
    b = B()
    
    print(b.name) # ls

    10  在子类如何调用父类的属性和方法呢:

    第一种方式 在子类中调用需要先调用父类的 __init__(self) 的方法  再调用父类的属性或者方法

    class B(A):
        def __init__(self):
            self.name = 'ls'
    
        def fn(self):    
            A.__init__(self)  #  在这里使用父类的属性
            return A().name
    
    b = B()
    
    print(b.fn()) # zs 

    11 定义私有的属性和方法 以__开头

    class A():
        def __init__(self):
            self.__name = 'zs'
            self.age = 20
    
        def __fn(self):
            print('私有的方法')
    
    a = A()
    print(a.__name) # 报错
    print(a.age) # 20 

    12 类的多态

    class Dog():
        def fn(self):
            print('wangwnag')
    
    class Person():
        def fn(self):
            print('你好')
    
    class Lei():
        def fn(self,lei):
            return lei.fn()
    
    dog = Dog()
    person = Person()
    lei = Lei()
    lei.fn(dog) # wangwang
    lei.fn(person) # 你好

    13 类方法的使用场景。 如访问私有类属性的时候 定义类的方法 使用@claasmethod

    class A():
        __tools = 'wo'
        @classmethod
        def fn(cls):
            print(cls.__tools)
    
        def fn1(self):
            print(self.__tools)
    
    a = A()
    a.fn1()
    a.fn()

    14 静态方法既可以类访问也可以对象访问

    class A():
        __tools = 'wo'
        def fn1(self):
            print(self.__tools)
        @staticmethod
        def fn():
            print('123')
    
    
    A.fn()
    a =A()
    a.fn()

    15  捕获错误

    try:
        print(1/0)
    except:
        print('出现了错误')
    else:
        print('没有错误')
    finally:
        print('不管有没有错都打印')
    try:
        print(1/0)
    except (NameError,ZeroDivisionError):  # 捕获指定的错误
        print('出现了错误')
    else:
        print('没有错误')
    finally:
        print('不管有没有错都打印')
    try:
        print(1/0)
    except (NameError,ZeroDivisionError) as error:  # 捕获指定的错误
        print(error) # 打印报错信息
    else:
        print('没有错误')
    finally:
        print('不管有没有错都打印')

    16 模块的导入方式:

    import 模块名

    from 模块名  import 功能名

    from 模块名  import *

    from 模块名  as 别名

    from 模块名  import 功能名 as 别名

    17 在文件中定义导出的方法 使用 __all__ = ['导出的方法']

    __all__ = ['test']

    test ():

            print(‘123’)

    18 创建包 包会自创一个__init__的文件

    在这个文件中可以定义导出的模块列表

    正常导入 import 包名.文件名  使用的时候 包名.文件名.方法()

    18 __dict__将实例对象 转化为字典的形式{}

    class A():
        def __init__(self):
            self.age = 20
    
    a = A()
    print(a.__dict__) # {'age': 20}

    19 eval() 将字符串变为list 

    a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
    
    print(eval(a)) #  [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
    
    b = "[{'bane':'123'},{'age':'12'}]"
    print(eval(b)) # [{'bane': '123'}, {'age': '12'}]

  • 相关阅读:
    11 多线程与高并发 - JUC 阻塞队列(PriorityQueue、PriorityBlockingQueue、DelayQueue)源码解析
    架构师技能9-深入mybatis:Creating a new SqlSession到查询语句耗时特别长
    国标28181 开源WVP-PRO项目部署
    第三章 LInux多线程开发 3.1-3.5线程创建 终止 分离
    程序员做自己的产品 “在线客服系统” 之:种子用户的重要性
    qmake 手册:qmake 入门
    【文末送书——数学经典著作】工科必备的数学思维培养
    数据屏蔽:静态与动态
    Java | 一分钟掌握定时任务 | 8 - XXL-Job分布式定时任务
    CrossOver2023(Mac电脑运行Windows软件)
  • 原文地址:https://blog.csdn.net/h960822/article/details/139753925