• python之self的正确理解和访问限制的有关内容


    如何理解self?

    先说结论:self可以理解为对象本身

    举例:

    #定义一个动物类
    class Animal():
        #定义一个初始化方法
        def __init__(self,name):#self=dog,name="二哈"
            self.name = name
        #定义一个普通方法
        def printName(self):
            print('动物的名字是:%s'%self.name)  #self=dog
    # 声明一个函数
    def myPrint(animal): # animal = dog
        animal.printName()  # dog.printName(对象.方法名)
    #实例化创建一个对象dog
    dog = Animal('二哈')
    print(dog.name)#输出name属性的属性值
    #调用函数
    myPrint(dog)  #把dog对象当做myPrint函数的参数 dog.name
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    二哈
    动物的名字是:二哈
    
    • 1
    • 2

    烤牛排实例:

    class roast_beef():#定义烤牛排的实例
        def __init__(self):#编写关于roast_beef类的方法__init__()
        		#默认原始数据
            self.roast_time=0
            self.roast_level="生的"
            self.roast_Condiment= []#将顾客所需配料放在列表中
        #该方法的功能:用用户提供的时间判断牛排的烤制程度
        def cook(self,roast_times):
           self.roast_time+=roast_times
           if  0<roast_times<5:
               self.roast_level="不太熟"
           elif  5<roast_times<9:
                self.roast_level="口感很好"
           else:
                self.roast_level = "有点糊了"
        #该方法的功能:实现用户配料的存储
        def Condiment(self, roast_Condiments):
         #等价于s.roast_Condiment.append(roast_Condiments)
            self.roast_Condiment.append(roast_Condiments)     
    s=roast_beef()
    s.cook(7)#传递烤制时间
    #传递所需配料
    s.Condiment("黑胡椒")
    s.Condiment("孜然")
    print(s.roast_time)
    print(s.roast_level)
    print(s.roast_Condiment)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    访问限制:

    私有属性:

    一般情况下,一个实例的属性不单单只有一个,通常有多种属性,但是,有些属性属于比较隐私化,我们不想让外界去调用它,此时,我们可以将其设置为私有属性,设置方法为:在属性前加两个下划线,此时属性名不能被外界访问了。

    举例:

    class People():
        def __init__(self,name,money):
            self.__name = name  # 定义私有属性name
    
    • 1
    • 2
    • 3

    私有属性的实现原理:

    在python中,私有属性是通过改名的方式实现的,怎么理解呢?
    举例:

    class People():
        def __init__(self,name,money):
            self.__name = name  # 定义私有属性name
    people1=People("易烊千玺")
    print(people1.name)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    通过上面的方法,我们将name改成了__name,python内部会将私有属性改成_People__name,所以使用people1.__name找不到该属性,此时编译器告诉我们没有这个属性。

    AttributeError: 'People' object has no attribute 'name'
    
    • 1

    但是私有属性也不是完全没有办法去访问,既然python将其改变为了_People__name,那么我们就使用people1._People__name的方式看是否能访问私有属性name
    在这里插入图片描述
    私有属性被正确访问。

    为什么要有私有属性呢?

    因为在父类中定义的内部属性,不希望在外部改变,而子类在继承父类的同时,定义了相同的属性,则会将父类同名的属性覆盖,所以需要使用私有属性进行保护。

    受保护属性:

    在类中定义的属性,在属性前加_(一个下划线),则表示该属性为受保护的属性,受保护属性和私有属性目的一样,都是不希望外部修改该属性,将属性保护起来。

    受保护属性的原理:

    与私有属性不同的时,受保护属性在代码执行的过程中,对该属性并不会做任何处理,但程序员之间约定,不会在类外部使用该属性。
    举例:

    class People():
        def __init__(self,name):
            self._name = name  # 定义受保护属性name
    people1=People("易烊千玺")
    print(people1._name)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    通过普通访问,受保护属性也被正确输出。

    数据过滤:

    当数据传递进来的时候,并不是每个数据都是我们所想要的,那么此时,我们便可以对传递的属性值进行筛选。
    操作如下:

    class People(object):
        #定义普通方法对属性设置
        def setName(self,value):
            #数据过滤
            if len(value) <= 4:
                self.__name = value
            else:
                print('名称的长度不能大于4个字符')
    s=People()
    s.setName("ob")
    s.setName("obwivhdo")
    print(s._People__name)#打印符合规定的数据
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    名称的长度不能大于4个字符
    ob
    
    • 1
    • 2

    除了上面使用s._People__name获取私有属性的属性值之外,我们还可以使用定义普通方法获取属性值。
    操作如下:

    class People(object):
        #定义普通方法对属性设置
        def setName(self,value):
            #数据过滤
            if len(value) <= 4:
                self.__name = value
            else:
                print('名称的长度不能大于4个字符')
            # 定义普通方法获取属性值
        def getName(self):
            return self.__name
    s=People()
    s.setName("dcb")
    print(s.getName())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    dcb
    
    • 1

    私有方法:

    与私有属性相对应,私有属性,不希望外界可以获取的属性,那么私有方法即为不希望外界可以调用的方法,定义方法即为在方法名前加__(两个下划线)。
    举例:

     def __sayHello(self):
            print('我的名字是:%s,我有%s存款' % (self.__name, self._money))
    
    • 1
    • 2

    获取私有方法:

    与获取私有属性的方法相同,可通过_类名__方法,或者编写一个公有方法进行获取。
    举例:

    class People(object):
        def __init__(self, name, money):
            self.__name = name  # 定义私有属性name
            self._money = money  # 定义受保护的属性money
        def setName(self, value):
            # 数据过滤
            if len(value) <= 4:
                self.__name = value
            else:
                print('名称的长度不能大于4个字符')
            # 定义普通方法获取属性值
        def getName(self):
            return self.__name
        # 定义私有方法
        def __sayHello(self):
            print('我的名字是:%s,我有%s存款' % (self.__name, self._money))
    s=People("你好",1000)
    s._People__sayHello()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    我的名字是:你好,我有1000存款
    
    • 1

    编写共有方法,进行简介访问

       def test(self):
            print(self.__name)
            print(self._money)
            self.__sayHello()#等价于s.__sayHello()
    s=People("你好",1000)
    s.test()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    你好
    1000
    我的名字是:你好,我有1000存款
    
    • 1
    • 2
    • 3

    修改属性值:

    1:直接修改:对象.属性=新的属性值

    举例:

    class People(object):
        def __init__(self, name, money):
            self.__name = name  # 定义私有属性name
            self._money = money  # 定义受保护的属性money
    s=People("你好",1000)
    s.name="张三"
    print(s.name)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    2:间接修改:对象.要修改的属性方法名(" 新的属性值")

    举例:

    class People(object):
        def __init__(self, name, money):
            self.__name = name  # 定义私有属性name
            self._money = money  # 定义受保护的属性money
            # 定义普通方法对属性设置
        def setName(self, value):
                # 数据过滤
            if len(value) <= 4:
                self.__name = value
            else:
                print('名称的长度不能大于4个字符')
            # 定义普通方法获取属性值
        def getName(self):
            return self.__name
            # 定义私有方法
        def __sayHello(self):
            print('我的名字是:%s,我有%s存款' % (self.__name, self._money))
            # 定义公有方法获取私有属性和私有方法
        def test(self):
            print(self.__name)
            print(self._money)
            self.__sayHello()
    s=People("王俊凯",10)
    s.setName("易烊千玺")
    s.test()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    易烊千玺
    10
    我的名字是:易烊千玺,我有10存款
    
    • 1
    • 2
    • 3

    特殊属性:

    __xx__相当于公有属性,可以直接进行访问
    举例:

    class People(object):
        def __init__(self, name, money):
            self.__name__ = name  # 定义私有属性name
            self._money = money  # 定义受保护的属性money
    s=People("彭于晏",10000000000)
    print(s.__name__)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    彭于晏
    
    • 1

    获取当前文件路径:

    print(__file__)
    
    • 1
    C:/Users/Lenovo/PycharmProjects/pythonProject4/main.py
    
    • 1
  • 相关阅读:
    YUM源的几种常见方式
    案例题-系统开发
    文件打开表有几个?——参考《王道考研》
    云小课|MRS基础原理之MapReduce介绍
    Redis应用案例之优惠券秒杀
    OBS Studio免费开源录屏工具
    大数据培训企业开发案例实时读取本地文件到HDFS案例
    百度文心一言 VS GPT
    随机化算法概述
    传统企业如何实现数字化转型?这套方法论超实用!
  • 原文地址:https://blog.csdn.net/m0_64365419/article/details/125900216