文章内容:
1.外部调用与内部调用
2.成员的可见性:公开的,可以访问的,public。私有的,不可访问的,private。
3.如何在python中区分公开和私有
4.怎样可以去访问一个私有变量
5.是否可以动态的去添加一个私有变量
'''
python类:
变量:类变量
:实例变量
方法:实例方法
:类方法
:静态方法
构造函数
成员的可见性(变量和方法的可见性,内外之分/公开和私有)
'''
#外部调用与内部调用
class Student():
sum1=0
def __init__(self,name,age):
self.name=name
self.age=age
def do_homework(self):
self.do_english_homework()#内部调用
print('homework')
def do_english_homework(self):
print('english_homework')
@classmethod
def plus_sum(cls):
cls.sum1+=1
print(cls.sum1)
@staticmethod
def add(x,y):
print('this is a static method')
student1=Student('小红帽',9)
student1.do_homework()#外部调用
student1.do_english_homework()#外部调用
#成员的可见性
#公开的,可以访问的,public
class Student():
sum1=0
def __init__(self,name,age):
self.name=name
self.age=age
self.score=0
self.__class__.sum1+=1
def marking(self,score):
self.score=score
print(self.name+'分数为:'+str(self.score))
@classmethod
def plus_sum(cls):
cls.sum1+=1
print(cls.sum1)
@staticmethod
def add(x,y):
print('this is a static method')
student1=Student('小红帽',9)
student1.marking(90)#小红帽分数为:90
student1.score#90
student1.score=-1
student1.score#-1
#私有的,不可访问的,private
#其它语言中使用public和private关键字,python中没有
#python中使用__双下划线区分公开和私有
class Student():
sum1=0
def __init__(self,name,age):
self.name=name
self.age=age
self.score=0
self.__class__.sum1+=1
def __marking(self,score):##私有的,不可访问的,不可从外部访问
self.score=score
print(self.name+'分数为:'+str(self.score))
@classmethod
def plus_sum(cls):
cls.sum1+=1
print(cls.sum1)
@staticmethod
def add(x,y):
print('this is a static method')
student1=Student('小红帽',9)
student1.__marking(90)
#AttributeError: 'Student' object has no attribute '__marking'
#构造函数__init__是一个特有的函数,因此是可以从外部访问的
#同样把__marking改为__marking__,就不是私有的,可以从外部访问
class Student():
sum1=0
def __init__(self,name,age):
self.name=name
self.age=age
self.__score=0
self.__class__.sum1+=1
def marking(self,score):##私有的,不可访问的,不可从外部访问
self.__score=score
print(self.name+'分数为:'+str(self.__score))
@classmethod
def plus_sum(cls):
cls.sum1+=1
print(cls.sum1)
@staticmethod
def add(x,y):
print('this is a static method')
student1=Student('小红帽',9)
student1.marking(90)#小红帽分数为:90
a=student1.marking(90)#小红帽分数为:90
print(a)#None
student1.__score=-1#没有报错???
#没有报错的原因,通过.__score方式添加了一个新的__score实例变量
student2=Student('大红帽',18)
print(student1.__score)#-1
print(student2.__score)#AttributeError: 'Student' object has no attribute '__score'
##报错原因:无法访问实例变量里的__score
print(student1.__dict__)
#{'name': '小红帽', 'age': 9, '_Student__score': 90, '__score': -1}
#其中无法访问的私有实例变量__score是以_Student__score的形式存在的
print(student2.__dict__)
#{'name': '大红帽', 'age': 18, '_Student__score': 0}
##结论:动态的去添加一个私有变量是不可以的
print(student2._Student__score)#0,可以间接地去访问私有变量,没有什么事不能访问的