笔记Python面向对象———类与对象中的成员可见性(变量和方法的可见性,公开和私有)

文章内容:

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,可以间接地去访问私有变量,没有什么事不能访问的

 

你可能感兴趣的:(笔记Python面向对象———类与对象中的成员可见性(变量和方法的可见性,公开和私有))