python面向对象类属性_【python】面向对象——对象属性和类属性

对象没有函数属性,只有数据属性

属性分类

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

实例属性与类属性同名时,类属性没有任何作用。

**************************真正的结束分割线**************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值