• Python学习札记(三十二) 面向对象编程 Object Oriented Program 3


    参考:访问限制

    NOTE

    1.eg.

    #!/usr/bin/env python3
    
    class Student(object):
    	"""docstring for Student"""
    	def __init__(self, name, age, city):
    		self.__name = name
    		self.__age = age
    		self.__city = city
    
    	def print_info(self):
    		print(self.__name, self.__age, self.__city)
    
    	def changeinfo(self, option, value):
    		if option == 'name':
    			self.__name = value
    		elif option == 'age':
    			self.__age = value
    		elif option == 'city':
    			self.__city = value
    
    def main():
    	student = Student('Chen', 20, 'FuZhou')
    	student.print_info()
    	cg = int(input())
    	if cg == 0:
    		student.changeinfo('name', input())
    	elif cg == 1:
    		student.changeinfo('age', int(input()))
    	elif cg == 2:
    		student.changeinfo('city', input())
    	student.print_info()
    
    if __name__ == '__main__':
    	main()
    
    sh-3.2# ./oop2.py 
    Chen 20 FuZhou
    0
    Wang
    Wang 20 FuZhou
    
    sh-3.2# ./oop2.py 
    Chen 20 FuZhou
    1
    21
    Chen 21 FuZhou
    
    sh-3.2# ./oop2.py 
    Chen 20 FuZhou
    2
    HangZhou
    Chen 20 HangZhou
    

    2.在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。但是,如果要确保外部代码不能随意修改对象内部的状态,就需要有private属性的存在。

    如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。

    如:

    def __init__(self, name, age, city):
        self.__name = name
        self.__age = age
        self.__city = city
    

    其中__name,__age,__city是私有变量,无法被外界访问,需要借助类提供的方法来访问:

    def print_info(self):
        print(self.__name, self.__age, self.__city)
    

    这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。

    3.需要注意的是与__xxx__变量的区别,它在Python中是特殊变量,也就是以双下划线开头,并且以双下划线结尾的,允许外部直接访问。

    4.原理:不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name

    也就是:

    _[类名]__[属性名]
    

    外界也可以通过这样的方法引用它:

    print(student._Student__name)
    

    但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名。

    也就是说,不同的解释器会解释成不一样的结果。

    5.Python本身没有任何机制阻止你干坏事,一切全靠自觉。有点培养代码洁癖的意思哈哈。

    6.错误写法:

    	stu_a = Student('antonin', 20, 'SA')
    	stu_a.__name = 'Chen'
    	stu_a.print_info()
    

    看上去像是从外部修改了__name属性,但是实际上是为这个对象新加入了一个属性__name,其本身的stu_a._Student__name 还是不变:

    sh-3.2# ./oop3.py 
    antonin 20 SA
    

    2017/2/25

  • 相关阅读:
    Permission Denial: opening provider 隐藏的android:exported属性的含义
    GPL & Apache License
    JAVA把毫秒数转换成日期
    Android开发–Intent-filter属性详解
    [转]unix/linux中的dup()系统调用
    【转载】技术的正宗与野路子
    virtualbox -centos ping不通外网
    GNU Make 手册中文版
    Git源码学习
    git-gui
  • 原文地址:https://www.cnblogs.com/qq952693358/p/6442190.html
Copyright © 2020-2023  润新知