一、类属性与实例属性
1:实例属性:
在__init__(self,...)中初始化
内部调用时都需要加上self.
外部调用时用“对象名.属性名”调用
eg:
# 实例属性
class eg():
def __init__(self,name,food):
self.name = name
self.food = food
#内部调用:self.属性名
def neibu(self):
print(self.name,self.food)
#实例化
a=eg('job','fish')
#外部调用:对象名.属性名
a.name='hello'
print(a.name)
2:类属性:
在__init__()里初始化
在内部用classname.类属性名调用
外部既可以用classname.类属性名又可以用instancename.类属性名来调用
eg:
#类属性
class eg1():
country = 'China' #类属性
def __init__(self,name,food):
self.name = name
self.food = food
# 内部调用:类名.类属性名
def a(self):
print(eg1.country)
#外部调用:类名.类属性名
print(eg1.country)
3:私有属性:
双下划线__开头:外部不可通过“对象名.属性名”来访问或者更改,实际将其转化为了“_类名__属性名”。
eg:
#私有属性
class eg2():
def __init__(self,name,food,country):
self.name = name
self.food = food
self.__country = country #私有属性
def a(self):
print('我是私有属性:%s'%self.__country)
#实例化
b=eg2('MgVccl','fish','China')
#外部不可通过“对象名.属性名”来访问私有属性
print(b.country) # AttributeError: 'eg2' object has no attribute 'country'
二、访问限制
1. 私有类属性、私有对象属性
为了保护属性不被随意修改和访问,可以将属性定义为私有属性。 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。
2.私有属性不能直接通过对象访问属性,但是可以通过“实例化对象名._类名__属性名”直接进行访问。但是不建议这样操作.不同版本的Python解释器可能会把“__属性名”改成不同的变量名。 总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉。
3.通过“对象名.__属性名”直接修改私有属性。
表面上看好像修改了其实并没有,因为Python解释器已经将对象内部的属性名解释成“_类名__属性名”。如果在外部修改相当于另外声明一个属性。 能直接修改吗?类属性可以直接修改通过类名._类名__属性名=(可通过类方法定义后面说明)。
eg:
class eg3():
def __init__(self,name,food,country):
self.name = name
self.food = food
self.__country = country #私有属性
def a(self):
print('我是私有属性:%s'%self.__country)
#实例化
c=eg3('MgVccl','fish','China')
#可以通过“实例化对象名._类名__属性名”直接进行访问
#不建议这样操作.不同版本的Python解释器可能会把“__属性名”改成不同的变量名。
# print(c._eg3__country)
#在外部修改相当于另外声明一个属性
c.__country='重庆'
print(c.__country)
练习:
使用面向对象的方式实现加减乘除四则运算。
#使用面向对象的方式实现加减乘除四则运算。
class operation():
'''
加减乘除的四则运算:
加法:add(x,y) x+y;
减法:sub(x,y) x-y;
乘法:mul(x,y) x*y;
除法:div(x,y) x/y;
'''
#实例化属性
def __init__(self,x,y,s):
self.x = x
self.y = y
self.s = s
# 加法:add(x,y) x+y
def add(self):
self.s = self.x + self.y
return print('%d + %d = %d'%(self.x,self.y,self.s))
# 减法:sub(x,y) x-y
def sub(self):
self.s = self.x - self.y
return print('%d - %d = %d'%(self.x,self.y,self.s))
# 乘法:mul(x,y) x*y
def mul(self):
self.s = self.x * self.y
return print('%d * %d = %d'%(self.x,self.y,self.s))
# 除法:div(x,y) x/y
def div(self):
if self.y == 0:
print('除数不能为0!')
else:
self.s = self.x / self.y
return print('%d / %d = %d'%(self.x,self.y,self.s))
if __name__ == '__main__':
x=int(input('请输入x:'))
y=int(input('请输入y:'))
s=0
a=operation(x,y,s)
a.add()
a.sub()
a.mul()
a.div()