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()


    处在这个俗世,也得让自己变得更好吧
  • 相关阅读:
    Python操作Excel表格
    Python爬虫实战:爬取美食节川菜信息
    超级实用的Python网络爬虫反反爬策略之构造UA池及IP代理池
    Python 静态方法
    IDEA连接远程服务器Docker部署Spring Boot项目
    Dockerfile 解析
    Python爬虫实战-统计博客园阅读量问题
    Docker 容器数据卷
    Docker镜像
    PL/SQL
  • 原文地址:https://www.cnblogs.com/butaileng7/p/14539439.html
Copyright © 2011-2022 走看看