• python学习笔记 day22 面向对象(二)


     类名

    类名() 就是类的实例化,可以创建一个对象,类实例化就会自动调用def __init__(self)初始化方法,self可以代表实例化的对象,是必须要传的参数;

    类名()可以调用类属性(就是在def __init__(self)初始化方法之前定义的,也叫静态属性),类名().类属性 不依赖于对象,就是没有实例化,这个类就拥有的类属性;

    类名()也可以调用方法;

    对象

    对象就是类的实例化得到的 过程如下:

    类名() 会实例化为对象,自动调用类内的初始化方法def __init__(self,*args.**kwargs) ;

    然后执行该初始化方法,把刚才实例化时传入的参数(类名(*args,**kwargs))传入初始化方法中,这个def __init__(self,*args,**kwargs)中的self 就是对象(执行完初始化方法之后会将self返回给类实例化的对象),定义类的时候一开始就会self创建一个大字典{};

    然后执行def __init__(self,*args,**kwargs) 初始化方法的内容,其实就是给属性赋值,self刚开始是一个空字典,然后加的属性就作为字典self的key 然后通过赋值就是传给self 字典的key(属性名) 对应的value;

    执行完初始化方法之后,会自动把self这个对象(其实是一个字典,key 就是初始化方法中自己创建的属性,value就是传给属性的值)返回给类实例化的对象;

    对象其实就是类的一个实例,可以查看属性,调用方法;

    看一个定义类,类名()--->实例化类,类名.类属性 --->查看类属性  , 类实例化---->得到对象, 对象.属性名------>查看属性,类名.方法----->调用方法的过程:

    class Student():  # 定义一个类
        School='XMU'  # 类属性,又叫静态属性,是不用实例化类就可以被类名查看,后面类实例化的所有对象都共同拥有的属性
        def __init__(self,name,age,sex,grade): # 初始化方法,类实例化的时候就会被自动调用,self是对象,执行完实例化方法之后就会被返回给实例化类得到的对象,自动会建立的,本质是一个字典,key就是创建的属性,value就是给属性传的值
            self.name=name   # 属性,其实这里self是一个字典,相当于不断增加key-value key 就是左边创建的属性名,value就是右边传入的参数值
            self.age=age
            self.sex=sex
            self.grade=grade
        def eat(self):  # 方法,可以被对象调用
            print("%s正在吃饭..."%self.name)
        def sleep(self,time):
            print("现在是%s点,%s正在睡觉..."%(time,self.name))
    
    print('类名查看类属性School:',Student.School)   # 类名调用类属性
    s1=Student('xuanxuan','22','','研二') # 实例化一个类,自动执行初始化方法,这里传的参数就会传递给初始化方法中,执行完初始化方法自动将self对象返回给s1这个对象,其实是一个字典,里面以键值对的方式存储属性和属性值
    print('对象查看类属性School:',s1.School)  # 对象也可以调用类属性(类属性是静态属性,类名可以查看类属性,所有被这个类实例化的对象都可以查看该类属性)
    print('name:',s1.name)    # 对象可以查看属性,这里s1就是对象,其实就是跟类定义中的self一样,本质是一个字典,键值对存放属性-属性值,只不过对象查看属性是对象.属性,跟之前字典查看方式不太一样而已;
    s1.eat()   # 对象可以调用方法,这里的s1.eat()就相当于Student.eat(s1) 就是把s1传给self了,外面里面一切s1.属性,都是相当于self.属性;
    s1.sleep('07:00') # 相当于Student.sleep(s1,'07:00')这里的s1传给self,07:00传给time 了
    
    print(Student.__dict__) # 类名可以调用__dict__用来查看类中有什么方法或者类属性
    print(s1.__dict__)  # 对象也可以调用__dict__用来查看对象有那些属性

     运行结果:

    修改属性:

    类名不可以修改类属性,对象可以在外部修改属性,添加属性~

    print('修改对象name属性前:',s1.name)
    print(s1.__dict__)
    s1.name='璇璇'
    print('修改对象name属性后:',s1.name)
    print(s1.__dict__)
    s1.hobby='睡觉'  # 给对象增加一个属性hobby;属性值为'睡觉'
    print("给对象增加一个属性hobby之后:",s1.hobby)
    print(s1.__dict__)

    运行结果:

    然而当我们企图通过类型修改类属性时:

    print("类属性School修改之前:",Student.School)
    print(Student.__dict__)
    Student.__dict__['School']='厦门大学'
    print("类属性School修改之后:",Student.School)
    print(Student.__dict__)

    运行结果:

    以这种Student.__dict__得到的是一个字典然后根据类属性(key)School来修改类属性的值,是会报错的,

    但是我有尝试了直接类名.类属性=新的值来修改,就是可以的:(震惊.jpg)----Eva-J没有提到,只是说类属性值无法修改。。。。

    print("类属性School修改之前:",Student.School)
    print(Student.__dict__)
    Student.School='厦门大学'
    print("类属性School修改之后:",Student.School)
    print(Student.__dict__)

    运行结果:

    类定义+类实例化调用方法的过程:

    talk is cheap,show me the code
  • 相关阅读:
    5款程序员必备的Google插件! 不及格的程序员
    MA5680T管理软件、光猫自动注册、U2000光猫自动注册辅助工具隆重发布了
    kubernetes 部署 traefik2.5
    k8s设置自动补全
    openssl rand base64 生成随机字符串
    k8s1.23.6 安装kubeprometheus 无法获取监控数据
    harbor镜像仓库自动清理脚本
    《Java架构师的第一性原理》52算法之labuladong的算法小抄之框架套路
    基于信息检索和深度学习结合的单元测试用例断言自动生成
    勇往直前,做全能开发者,华为伙伴暨开发者大会2022精彩活动正式解锁!
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9661711.html
Copyright © 2020-2023  润新知