zoukankan      html  css  js  c++  java
  • python中的面向对象编程

    """
    类:可以理解是一个模板,通过它可以创建出无数个具体实例
    对象:类并不能直接使用,通过类创建出的实例(又称对象)才能使用。比如汽车图纸(类)和汽车(对象)的关系
    属性:类中的所有变量称为属性
    方法:类中的所有函数通常称为方法,和函数所有不同的是,类方法至少要包含一个 self参数
    类的使用顺序:1.创建(定义)类,也就是制作图纸的过程;
    2.创建类的实例对象(根据图纸造出实际的物品),通过实例对象实现特定的功能
    """

    # 类的创建需要使用 class 关键字
    # 基本语法格式:class 类名:
    # 多个(≥0)类属性...
    # 多个(≥0)类方法...
    class MyClass:
      x = 7
    
    print(MyClass)
    # 创建类对象的过程,又称之为类的实例化,所以也可以称之为实例对象,后续类对象都称为实例对象
    # 基本语法格式: 类名(参数)
    p1 = MyClass()
    print(p1.x)
    # __init()类构造方法
    # 语法格式:
    # def __init__(self,...):
    # 代码块
    # __init__() 方法可以包含多个参数,但必须包含一个名为 self 的参数,且必须作为第一个参数
    # 所有类都有一个名为 __init__() 的函数,它始终在启动类时执行。
    # 使用 __init__() 函数将值赋给对象属性,或者在创建对象时需要执行的其他操作
    class Person:
      def __init__(self, name, age):
        self.name = name
        self.age = age
    
    p1 = Person("Bill", 63)
    
    print(p1.name)
    print(p1.age)
    # 在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数
    # self 参数是对类的当前实例的引用,用于访问属于该类的变量。
    # 它不必被命名为 self,您可以随意调用它,但它必须是类中任意函数的首个参数
    # 进行实例化时最好第一个参数命名为self
    class Person:
        def __init__(self):
            print("正在执行构造方法")
        # 定义一个say()实例方法
        def say(self,name):
            print(name,"正在学Python")
    # 类变量和实例变量(类属性和实例属性)
    # 类体中、所有函数之外:此范围定义的变量,称为类属性或类变量;
    # 类体中,所有函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量;
    # 类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量

    # 类变量:在类中,但在各个类方法外定义的变量
    class Person:
        name = "you"     # 定义类变量
        age = "20"
        def say(self, content):     # 定义say实例方法
            print(content)
    # name 和 age 属于类变量
    # 类变量的特点:所有类的实例化对象都同时共享类变量,类变量在所有实例化对象中是作为公用资源存在的

    # 类方法的调用方式:使用类名直接调用,使用类的实例化对象调用
    print(Person.name)  #使用类名直接调用
    Person.name = "youcanwill" #修改类变量的值
    print(Person.name)
    # 类名不仅可以调用类变量,也可以修改值
    # 类变量为所有实例化对象共有,通过类名修改类变量的值,会影响所有的实例化对象


    # 实例变量:在任意类方法内部,以“self.变量名”的方式定义的变量
    # 只作用于调用方法的对象,实例变量只能通过对象名访问,无法通过类名访问
    class Person:
        def __init__(self):
            self.name = "you"
            self.age = "20"
    
        def say(self):  # 定义say实例方法
            self.catalog = 7
    # name、age以及catalog都是实例变量
    # __init__() 函数在创建类对象时会自动调用,而say()方法需要类对象手动调用
    # Test类的类对象都会包含name和age实例变量,只有调用了say()方法的类对象,才包含catalog实例变量
    TEST = Person()  # 只有调用say(),才会拥有catalog实例变量
    TEST.say()
    print(TEST.catalog)
    # 类方法中还可以定义局部变量,局部变量以“变量名=值”的方式进行定义
    class Price :
        def count(self,money):   # 定义say实例方法
            sale = 0.8*money
            print("优惠后的价格为:",sale)
    TEST= Price()
    TEST.count(100)
    # 优惠后的价格为: 80.0
    # 定义局部变量是为了所在类方法功能的实现,局部变量只能用于所在函数中,函数执行完成后,局部变量也会被销毁


    # 实例方法:定义在类中的函数:def 方法名 (self):
    class Person:
        #类构造方法,也属于实例方法
        def __init__(self):
            self.name = "李四"
            self.age = "20"
        # 下面定义了一个say实例方法
        def say(self):
            print("正在调用 say() 实例方法")
    # 实例方法调用:
    # 1.实例方法通常会用实例对象.方法名()调用
    test1 = Person()#创建一个实例对象
    test1.say()
    # 2.实例方法也可以使用类名调用,但是此方法需要手动给self参数传值
    # 格式:类名.方法名(实例对象)
    test1 = Person()
    Person.say(test1)
    # 类方法:和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为cls,Python 会自动将类本身绑定给cls参数
    # 类方法需要使用@classmethod修饰符进行修饰
    class Person:
        #类构造方法,也属于实例方法
        def __init__(self):
            self.name = "王五"
            self.age = "26"
        #下面定义了一个类方法
        @classmethod
        def info(cls):
            print("正在调用类方法",cls)
    # 如果没有 @classmethod,则Python解释器会将info()方法认定为实例方法,而不是类方法
    # 类方法推荐使用类名直接调用


    #使用类名直接调用类方法
    Person.info()
    # property()函数
    # 在不破坏类封装原则的前提下,依旧使用“类对象.属性”的方式操作类中的属性
    # 属性名=property(fget=None, fset=None, fdel=None, doc=None)
    # fget参数:指定获取该属性值的类方法
    # fset参数:指定设置该属性值的方法
    # fdel参数:指定删除该属性值的方法,最后的doc是文档字符串,说明此函数的作用
    # property() 函数中参数的指定并不是完全随意的,可以仅指定第1个、或前2个、或前3个,也可以全部指定
    class Person:
        def __init__(self, n):  # 构造函数
            self.__name = n
    
        def setname(self, n):  # 设置 name 属性值的函数
            self.__name = n
    
        def getname(self):  # 访问nema属性值的函数
            return self.__name
    
        def delname(self):  # 删除name属性值的函数
            self.__name = "xxx"
    
        name = property(getname, setname, delname, '说明文档')  # 为name 属性配置 property() 函数
    
    
    # 说明文档,print(test.name.__doc__)
    help(Person.name)
    TEST = Person("you")
    
    print(TEST.name)  # 调用 getname() 方法
    
    TEST.name = "胡汉三"  # 调用 setname() 方法
    print(TEST.name)
    
    del TEST.name  # 调用 delname() 方法
    print(TEST.name)
    # getname()方法中需要返回name属性,如果使用self.name的话,其本身又被调用getname(),会进入死循环
    # name属性必须设置为私有属性,即__name
    # name = property(getname, setname)
    # name是一个可读写的属性,但不能删除,因为函数中并没有为name配置用于函数该属性的方法
    # Person类中设计有delname()函数,这种情况下也不能用来删除name属性

    # Python 继承
    # 继承允许我们定义继承另一个类的所有方法和属性的类。
    # 父类是继承的类,也称为基类。
    # 子类是从另一个类继承的类,也称为派生类。
    # object 类是 Python 中所有类的父类
    # python中类的继承包括 单继承和多继承
    # 语法格式:
    # class 类名(父类1, 父类2, ...):
    # 类定义部分
    class ParentClass1: #定义父类
        pass
    
    class ParentClass2: #定义父类
        pass
    
    class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
        pass
    
    class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
        pass
    # 父类重写:子类继承父类后,个别类方法并不适用,对这类方法进行修改
    class Bird:
        #鸟有翅膀
        def isWing(self):
            print("鸟有翅膀")
        #鸟会飞
        def fly(self):
            print("鸟会飞")
    class Ostrich(Bird):
        # 重写Bird类的fly()方法
        def fly(self):
            print("鸵鸟不会飞")
    # 创建Ostrich对象
    ostrich = Ostrich()
    #调用 Ostrich 类中重写的 fly() 类方法
    ostrich.fly()
    # 调用父类中被重写的方法
    # 调用父类中被重写的方法
    class Bird:
        #鸟有翅膀
        def isWing(self):
            print("鸟有翅膀")
        #鸟会飞
        def fly(self):
            print("鸟会飞")
    class Ostrich(Bird):
        # 重写Bird类的fly()方法
        def fly(self):
            print("鸵鸟不会飞")
    # 创建Ostrich对象
    ostrich = Ostrich()
    #调用 Bird 类中的 fly() 方法
    Bird.fly(ostrich)
    #使用 类名调用其类方法,Python 不会为该方法的第一个 self 参数自定绑定值,因此采用这种调用方法,需要手动为 self 参数赋值。
    # 在子类中调用父类同名的方法
    # 两种方式:
    # 1. 父类名.方法名(self)
    # 2. super().方法名()

    # Python 3.x 中,super() 函数有一种更简单的语法格式
    # super().__init__(self,...)
    class People:
        def __init__(self,name):
            self.name = name
        def say(self):
            print("我是人,名字为:",self.name)
    class Animal:
        def __init__(self,food):
            self.food = food
        def display(self):
            print("我是动物,我吃",self.food)
    class Person(People, Animal):
        #自定义构造方法
        def __init__(self,name,food):
            #调用 People 类的构造方法
            super().__init__(name)
            #super(Person,self).__init__(name) #执行效果和上一行相同
            #People.__init__(self,name)#使用未绑定方法调用 People 类构造方法
            #调用其它父类的构造方法,需手动给 self 传值
            Animal.__init__(self,food)
    per = Person("zhangsan","熟食")
    per.say()
    per.display()


    处在这个俗世,也得让自己变得更好吧
  • 相关阅读:
    java 在线网络考试系统源码 springboot mybaits vue.js 前后分离跨域
    springboot 整合flowable 项目源码 mybiats vue.js 前后分离 跨域
    flowable Springboot vue.js 前后分离 跨域 有代码生成器 工作流
    Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器
    java 企业 网站源码 后台 springmvc SSM 前台 静态化 代码生成器
    java 进销存 商户管理 系统 管理 库存管理 销售报表springmvc SSM项目
    基于FPGA的电子计算器设计(中)
    基于FPGA的电子计算器设计(上)
    FPGA零基础学习:SPI 协议驱动设计
    Signal tap 逻辑分析仪使用教程
  • 原文地址:https://www.cnblogs.com/butaileng7/p/14539439.html
Copyright © 2011-2022 走看看