对象没有函数属性,只有数据属性
属性分类
1.数据属性→变量
数据属性分为:实例属性和类属性
2.函数属性→方法
在class(类)中,类属性和实例属性的分类:
classschool(object):#类属性
num = 1
#构造方法
def __init__(self, name, addr, type):#实例属性
self.name =name
self.addr=addr
self.type=typepass
defzhao_sheng(self):print('%s 正在招生,一共招生人数:%s' %(self.name, self.num))pass
在实例化生成对象过程中,只会产生实例属性,不会重新生成类属性和函数属性,也就是说,一旦修改原本类的类属性和函数属性,对象类属性和函数属性的会被同步修改。但是如果类实例化生成对象后,对象重写类属性后,修改类属性,对象的类属性不会同步修改。(详情见结尾)以上述为例,
实例化:
qinghua = school('清华', '北京', '公立学校') #实例化
print(qinghua.name) #输出实例属性
qinghua.zhao_sheng() #调用类的方法
'''清华
清华 正在招生,一共招生人数:1'''
1.重写类属性值:
school.num = 10 #重写类属性值
结果:
qinghua.zhao_sheng() #调用类的方法#清华 正在招生,一共招生人数:10
2.重写方法:
defkuo_zhao(self):print('%s决定扩招学生,本次将招收%s人'%(self.name, self.num))passschool.zhao_sheng=kuo_zhao #重写方法
注意:
⑴重写方法中的函数都是不带括号的
⑵重写方法时,如果改变重写方法的名字,对象调用时依然使用原方法的名字;如果用新方法的名字,则会报错。
结果:
qinghua.zhao_sheng() #调用类的方法,此时,用的是原方法的名字,而不是新方法的名字#清华决定扩招学生,本次将招收10人
完整代码如下:
classschool(object):#类属性
num = 1
#构造方法
def __init__(self, name, addr, type):#实例属性
self.name =name
self.addr=addr
self.type=typepass
defzhao_sheng(self):print('%s 正在招生,一共招生人数:%s' %(self.name, self.num))passqinghua= school('清华', '北京', '公立学校') #实例化
print(qinghua.name) #输出实例属性
qinghua.zhao_sheng() #调用类的方法
'''清华
清华 正在招生,一共招生人数:1'''school.num= 10 #重写类属性
qinghua.zhao_sheng() #调用类的方法#清华 正在招生,一共招生人数:10
defkuo_zhao(self):print('%s决定扩招学生,本次将招收%s人'%(self.name, self.num))passschool.zhao_sheng=kuo_zhao #重写方法
qinghua.zhao_sheng() #调用类的方法#清华决定扩招学生,本次将招收10人
此外,增加和删除属性的语法如下:
school.shuxing = 12 #增加类属性
print(qinghua.shuxing)del school.shuxing #删除属性
类实例化生成对象后,如果对象已经重写类属性,修改类属性时,对象的类属性不会同步修改:例子如下:
classschool(object):#类属性
num = 1
#构造方法
def __init__(self, name, addr, type):#实例属性
self.name =name
self.addr=addr
self.type=typepass
defzhao_sheng(self):print('%s 正在招生,一共招生人数:%s' %(self.name, self.num))passqinghua= school('清华', '北京', '公立学校') #实例化
beida = school('北大', '北京', '公立学校')print(qinghua.num, beida.num) #输出类属性#1 1
beida.num = 2 #修改对象的类属性,这个过程相当于生成实例属性
print(qinghua.num, beida.num) #输出类属性#1 2
school.num = 10 #重写类属性值
print(qinghua.num, beida.num) #输出类属性#10 2 只有qinghua的类属性被修改
qinghua.zhao_sheng()#调用类的方法#清华 正在招生,一共招生人数:10
beida.zhao_sheng() #调用类的方法#北大 正在招生,一共招生人数:2
defkuo_zhao(self):print('%s决定扩招学生,本次将招收%s人'%(self.name, self.num))passschool.zhao_sheng=kuo_zhao #重写方法
qinghua.zhao_sheng() #调用类的方法#清华决定扩招学生,本次将招收10人
beida.zhao_sheng() #调用类的方法#北大决定扩招学生,本次将招收2人
总结:(个人理解)
1.实例化时,对象只会生成实例属性
2.对象重写类属性时,会把该对象属性变为实例属性
2.如果类修改了类属性、函数属性,那么,所有对象的相应属性同步修改
3.我想到了C语言的指针,原理类似,如果不重写类属性,则所有对象的类属性指向类的类属性
**************************结束分割线**************************
补充:(没啥用)
增加对象的实例属性:
qinghua.a = 1
print(qinghua.a)#1
删除对象的实例属性:
del qinghua.a
修改对象的实例属性:
qinghua.a = 2
查看对象的属性:(包含类属性,实例属性)
qinghua.a
注意:类实例化生成对象时,不会产生类属性,查看类属性时,如果类属性名与实例属性名一样时,通过对象无法访问到类属性
classschool(object):#类属性
a = 1
#构造方法
def __init__(self, a):#实例属性
self.a =apassqinghua= school(2) #实例化时,a = 2
print(qinghua.a)#结果:a = 2,是实例化时传入类的值
school.a = 3 #修改类属性为: a = 3
print(qinghua.a)#结果:a = 2,是实例化时传入类的值
qinghua.a = 4 #修改类的实例属性,a = 4
print(qinghua.a)#结果:a = 4,是实例化时传入类的值
这就是为什么很多书生都说:类属性与实例属性名字不能相同,因为调用时,会先访问实例属性,当实例属性没有需要的变量时才会访问类属性,以下的例子
classschool(object):#类属性
a = 1
#构造方法
def __init__(self, name, addr, type, a):#实例属性
self.name =name
self.addr=addr
self.type=type
self.a=apass
defzhao_sheng(self):print('%s 正在招生,一共招生人数:%s' %(self.name, self.a))passqinghua= school('清华', '北京', '公立学校',2) #实例化时,a = 2
print(qinghua.a)#结果:a = 2,是实例化时传入类的值
school.a= 3 #修改类属性为: a = 3
print(qinghua.a)#结果:a = 2,是实例化时传入类的值
qinghua.a= 4 #修改类的实例属性,a = 4
print(qinghua.a)#结果:a = 4,是实例化时传入类的值
qinghua.zhao_sheng()#结果: 清华 正在招生,一共招生人数:4
实例属性与类属性同名时,类属性没有任何作用。
**************************真正的结束分割线**************************