• python学习——类


    """
    类定义:
    关键字:class
    语法:
    
    class  类名:
        # 类里面的代码
    
    类名的命名规范:遵循标识符的命名规范,风格采用大驼峰命名法(每个单词的第一个字母大写)
    
    
    通过类创建对象:
    对象 = 类名()
    
    """
    
    class Cat:
        pass
    
    
    class MyTestClass:
        pass
    
    
    # 关于对象:有人叫对象,也有人叫实例
    
    # 通过类创建对象(实例化对象)
    kitty = Cat()
    
    print(kitty, id(kitty))
    
    coffee = Cat()
    print(coffee, id(coffee))

    类属性和实例属性

    """
    这一类事物拥有的共同特征,我们通常会定义为类属性
    
    类属性:在类里面直接定义的变量,叫做类属性
    # 通过对象访问类属性:对象名.属性名
    # 通过类访问类属性:类名.属性名
    
    
    实例属性:每个对象的属性值都有可能不一样,就应该定义为实例属性(对象属性)
    实例属性的定义:对象.属性名 = 属性值
    
    
    """
    
    print("------------------类属性--------------------")
    class Cat:
        leg = "四条腿"
        tail = "长尾巴"
    
    
    kitty = Cat()
    coffee = Cat()
    
    # 通过对象访问类属性:对象名.属性名
    print(kitty.leg)
    print(coffee.leg)
    # 通过类访问类属性:类名.属性名
    print(Cat.leg)
    
    
    print("------------------实例属性--------------------")
    
    
    class Cat:
        leg = "四条腿"
        tail = "长尾巴"
    
    
    kitty = Cat()
    coffee = Cat()
    # 给对象添加属性
    kitty.name = "凯蒂猫"
    kitty.age = 2
    kitty.gender = ""
    
    coffee.name = "加菲猫"
    coffee.age = 1
    coffee.gender = ""
    
    # 通过对象访问对象属性:对象名.属性名
    print(kitty.name)
    print(coffee.name)
    
    # 通过类访问类属性:类名.属性名
     print(Cat.leg)

    在类里面定义对象属性

    """
    定义在类里面的函数叫做方法:
    
    __init__方法:初始化方法,在创建对象的时候,会自动调用执行里面的代码
    
    关于方法中的第一个参数self:self代表的时对象,不用手动传,调用用改方法的时候会自动传
    
    """
    
    # init方法的作用
    class Cat:
        leg = "四条腿"
        tail = "长尾巴"
    
        def __init__(self, name1, age1, gender1):
            """初始化对象属性"""
            self.name = name1
            self.age = age1
            self.gender = gender1
    
    
    kitty = Cat("凯蒂猫", 2, "母猫")
    print(kitty.name)   #这里self就等于kitty
    
    coffee = Cat("加菲猫", 1, "公猫")
    print(coffee.name)
    
    
    #  定义一个学生类
    class Students:
        attr1 = "学生"
    
        def __init__(self, name, age, class_):
            self.name = name
            self.age = age
            self.class_ = class_

    类里面的方法

    """
    特征  +  行为
    特性:属性(类属性,和实例属性)
    行为:方法(类方法,实例方法),方法的本质就是类里面的函数
    
    
    实例方法:第一个参数是self,self代表的是对象本身,那个对象调用该方法,self就代表那个对象
    实例方法:只能通过对象去调用
    
    类方法:@classmethod进行装饰(标识)
    第一个参数是cls,cls代表的是类本身
    
    静态方法:@statictmethod进行装饰(标识)
    """
    
    class Cat:
        leg = "四条腿"
        tail = "长尾巴"
    
        def __init__(self, name, age, gender):
            """初始化对象属性"""
            self.name = name
            self.age = age
            self.gender = gender
    
        def skill1(self, skill_name):
            print("{}施展了抓老鼠的技能:{}".format(self.name, skill_name))
    
        def skill2(self):
            print("施展了爬树的技能")
    
        @classmethod
        def func(cls):
            print(cls)
            print("这个是类方法")
    
        @staticmethod
        def func2():
            print("这个是静态方法")
    
    
    kitty = Cat("凯蒂猫", 2, "母猫")
    coffee = Cat("加菲猫", 1, "公猫")
    print(kitty.name)
    print(coffee.name)
    
    kitty.skill1("往前扑")
    coffee.skill1("从天而降")
    

    关于方法的调用:

    实例方法:只能通过对象去调用
    Cat.skill2()
    类方法:可以通过类和对象去调用
    Cat.func()
    kitty.func()
    静态方法:可以通过类和对象去调用
    Cat.func2()
    kitty.func2()

    属性的访问:

    类属性:可以通过类和对象去访问
    对象(实例)属性:只有对象自己能用

    class Cat:
        leg = "四条腿"
        tail = "长尾巴"
    
        def __init__(self, name, age, gender):
            """初始化对象属性"""
            self.name = name
            self.age = age
            self.gender = gender
    
        def move(self):
            print("快速移动")
    
        def skill2(self):
            """在方法内部,会使用到对象相关的属性,或方法,那么适合定义为对象方法"""
            print("{}施展了抓老鼠的技能".format(self.name))
            self.move()
    
        @classmethod
        def func(cls):
            """在方法内部只会使用到类属性"""
            print("这个是猫类共同特征:", cls.leg, cls.tail)
    
        @staticmethod
        def func2():
            """方法内部,既不会使用类相关的属性和方法,也不会使用对象相关的属性和方法"""
            print("这个是静态方法")
    
        @staticmethod
        def func11():
            print("这是一个普通的函数")
    
    
    kitty = Cat("凯蒂猫", 2, "母猫")

     ----------------------------------------------------------------------------------

    01类属性之私有属性

    类属性:
    公有属性:既可以在类的内部使用,又可以在类外部使用。
    私有属性:私有属性,使用双下划线开头。私有属性,只能在类的内部使用,在类外面无法使用。

    class MyClass:
        # 公有属性
        attr = 100
        # 私有属性
        __attr = 999

    02类定义的两种形式

    # python3中下面两种类定义没有区别。
    
    # 方式一:不写继承的父类,默认继承object
    class MyTest:
        pass
    
    # 方式二:在类名的括号后面指定继承object这个类。
    class MyClass(object):
        pass
    
    #  python2中,方式一:的定义形式叫经典类,方式二:的定义形式叫新式类。

    03类的继承

    object:python中所有类的基类(祖宗类)

    关于继承:
    子类通过继承父类,能够获取父类中定义的所有属性和方法(私有属性除外)

    注意:父类不能使用子类的属性和方法。

    # 需求一:V1:大哥大
    class PhoneV1(object):
        def phone(self):
            print("打电话的功能")
    
    
    # 需求二:V2:功能机
    class PhoneV2(PhoneV1):
    
        def music(self):
            print("听音乐的功能")
    
        def send_msg(self):
            print("发送信息的功能")
    
    class PhoneV3(PhoneV2):
    
        def pay(self):
            print("支付功能")
    
        def game(self):
            print("玩游戏的功能")
    
    v1 = PhoneV1()
    v2 = PhoneV2()
    v3 = PhoneV3()
    
    # v1对应的类,
    v1.phone()
    
    # v2对应的类
    v2.phone()
    v2.music()
    v2.send_msg()
    
    # v3对应的类
    v3.phone()
    # v3.music()
    # v3.send_msg()
    # v3.pay()
    # v3.game()

      

    04重写父类方法

    调用的时候一级一级往上,同名方法先调用最下面子类中的

    # 在子类中定义和父类同名的方法(重写父类方法)
    
    class PhoneV1(object):
        def phone(self):
            print("打电话的功能")
    
    class PhoneV2(PhoneV1):
        def phone(self):
            print("功能机打电话的功能")
    
    class PhoneV3(PhoneV2):
        def phone(self):
            print("智能机打视频电话的功能")
    
     v3 = PhoneV3()
     v3.phone()
    
    结果:智能机打视频电话的功能

    05调用被重写的父类方法

    方式一:父类名.方法名(self)方式二:super().方法名()

    也是根据继承的循序调用父类
    class PhoneV1(object):
        def phone(self):
            print("打语音电话的功能")
    
    class PhoneV3(PhoneV1):
        def phone(self):
            print("智能机打视频电话的功能")
            print("。。。。五分钟过去,,,接下来想打语音电话")
    
            # 如何在这里调用父类里面的phone
    
            # 方式一:父类名.方法名(self
             PhoneV1.phone(self)
    
            # 方式二:super().方法名()
            super().phone()
    
    
    v3 = PhoneV3()
    v3.phone()

    06动态设置和获取属性

    getattr:获取类属性
    参数1:类
    参数2:属性名
    参数3: 如果属性不存在,则返回该值(默认值)

    class TestData:
        url = "http://www.baidu.com"
        method = "get"
    # 在类外面获取类属性
    print(TestData.url)
    
    res = getattr(TestData, "url1", "None")
    print(res)
    
    # 动态获取属性的含义:
    name = input("请输入要获取的属性名:")
    res = getattr(TestData, name, "None")
    print(res)

    类外面定义类属性

    方式一:类.属性名= 属性值
    方式二:使用setattr

    class TestData:
        url = "http://www.baidu.com"
        method = "get"
    # 类外面定义类属性
    # 方式一:类.属性名= 属性值
    TestData.attr = 100
    print(TestData.attr)
    
    
    # 方式二:使用setattr
    # 动态设置属性:setattr
    # 参数一:类
    # 参数二:属性名
    # 参数三:属性值
    setattr(TestData,"attr2",999)
    print(TestData.attr2)
    # 需求:把下面两个列表中的数据设为属性和对应的属性值
    title = ["name", "age", "gender"]
    data = ["木森", 18, ""]
    
    for i in range(len(title)):
        setattr(TestData, title[i], data[i])
    print(TestData.name)
    print(TestData.age)
    print(TestData.gender)

    动态删除属性 delattr
    参数一:类
    参数二 :属性名

    # 方式一:关键字:del
    del TestData.url
    print(TestData.url)
    
    #方式二:delattr
    name = input("请输入你要删除的属性:")
    delattr(TestData,name)
    print(TestData.url)
    # 扩展:使用del删除变量
    a = 100
    del a
    print(a)

    结果:NameError: name 'a' is not defined

    判断属性是否存在

    # 判断属性是否存在:存在返回Ture,不存在返回False
    res = hasattr(TestData, "url1")
    print(res)

    07super的应用场景

    class MyCalss:
    
        def __init__(self, a, b):
            self.a = a
            self.b = b
    
        def number(self):
            print("a+b的结果:", self.a + self.b)
    
    class MyClassV2(MyCalss):
    
        def number(self):
            super().number()
            # 在原方法的基础上扩展的新功能
            print("a-b的结果:", self.a - self.b)
            print("a/b的结果:", self.a / self.b)
    
    m = MyClassV2(11,22)
    m.number()

    08多继承

    class BaseA(object):
        attr_a = 100
        def func(self):
            print("func---------aaa")
    
    
    class BaseB(object):
        attr_b = 999
        def func(self):
            print("func---------bbb")
    
    class MyTest(BaseA, BaseB):
       def func(self):
            print("func---------mytest")
    
    #遇到同名方法,先找自己的,自己没有再BaseA,BaseB的顺序
  • 相关阅读:
    《团队-团队编程项目中国象棋-成员简介及分工》
    团队-编程项目 中国象棋-需求分析
    结对编程:贪吃蛇项目
    软件工程进阶
    JAVA第二次作业
    JAVA第一次作业
    JS解决重复绑定问题以及获取事件
    ECMAScript5学习笔记--第十四章 程序
    ECMAScript5学习笔记--第十三章 函数定义
    ECMAScript5学习笔记--第十二章 语句
  • 原文地址:https://www.cnblogs.com/erchun/p/12391184.html
Copyright © 2020-2023  润新知