zoukankan      html  css  js  c++  java
  • python3(二十三)classInstance

    """ 类和实例和访问权限 """
    __author__ = 'shaozhiqi'
    
    
    # class后面紧接着是类名,即Student,类名通常是大写开头的单词,
    # 紧接着是(object),表示该类是从哪个类继承下来的
    class Student(object):
        pass
    
    
    bart = Student()  # 变量bart指向的就是一个Student的实例
    bart.name = 'Bart Simpson'
    print(bart.name)  # Bart Simpson  --可以自由地给一个实例变量绑定属性,即使类里没有定义这个属性
    
    
    # 通过定义一个特殊的__init__方法,在创建实例的时候,就把我们任务必须的属性绑上去,如下:
    class Student(object):
    
        def __init__(self, name, score):
            self.name = name
            self.score = score
    
        def print_score(self):
            print('%s: %s' % (self.name, self.score))
    
    
    # __init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
    # 有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去:
    bart = Student('Bart Simpson ', 30)
    print('name: ', bart.name)  # name:  Bart Simpson  可以看出name是public的
    
    # 调用实例方法
    bart.print_score()  # Bart Simpson : 30
    
    
    # ----------------------------限制访问----------------------
    class Student2(object):
    
        def __init__(self, name, score):
            self.__name = name
            self.__score = score
    
        def print_score(self):
            print('%s: %s' % (self.__name, self.__score))
    
        # 对外暴露外部访问方法
        def get_name(self):
            return self.__name
    
        def set_name(self, name):
            self.__name = name
    
    
    bart2 = Student2('Bart Simpson2 ', 30)
    # print('name: ', bart2.__name)  # 访问异常 'Student2' object has no attribute '__name'
    print('name: ', bart2.get_name())  # name:  Bart Simpson2
    bart2.set_name('shao')
    print('name: ', bart2.get_name())  # name:  shao
    
    # 1.双下划线开头双下划线结尾
    # 在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,
    # 是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。
    # 2.单下划线开头的变量
    # _name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,
    # 意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
    # 3.只以双下划线开头
    # 不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,
    # 仍然可以通过_Student__name来访问__name
    bart2.__name = 'New Name'  # 设置__name变量!
    print(bart2.__name)  # New Name
    # 面上看,外部代码“成功”地设置了__name变量,但实际上这个__name变量和class内部的__name变量不是一个变量!
    # 内部的__name变量已经被Python解释器自动改成了_Student__name,而外部代码给bart新增了一个__name变量
    # 下面调用可以验证上面的结论
    print(bart2.get_name())  # shao
  • 相关阅读:
    作业2(5)
    作业2(7)
    作业2(4)
    作业2(3)
    作业2(1)
    作业3(5)
    作业3(6)
    实验7综合练习(4)
    实验7综合练习(2)
    计算成绩
  • 原文地址:https://www.cnblogs.com/shaozhiqi/p/11550418.html
Copyright © 2011-2022 走看看