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
原文地址:https://www.cnblogs.com/xuanxuanlove/p/9661711.html