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

简介: 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
二哈
动物的名字是:二哈

烤牛排实例:

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)

访问限制:

私有属性:

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

举例:

class People():
    def __init__(self,name,money):
        self.__name = name  # 定义私有属性name
私有属性的实现原理:

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


举例:

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

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

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

但是私有属性也不是完全没有办法去访问,既然python将其改变为了_People__name,那么我们就使用people1._People__name的方式看是否能访问私有属性name

私有属性被正确访问。

为什么要有私有属性呢?

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


受保护属性:

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


受保护属性的原理:

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

举例:

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

通过普通访问,受保护属性也被正确输出。

数据过滤:

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

操作如下:

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)#打印符合规定的数据
名称的长度不能大于4个字符
ob

除了上面使用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())
dcb

私有方法:

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

举例:

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

获取私有方法:

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

举例:

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()
我的名字是:你好,我有1000存款

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

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

修改属性值:

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)

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()
易烊千玺
10
我的名字是:易烊千玺,我有10存款

特殊属性:

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

举例:

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

获取当前文件路径:

print(__file__)
C:/Users/Lenovo/PycharmProjects/pythonProject4/main.py
相关文章
|
4月前
|
Python
Python中通过字符串访问与修改局部变量
Python中通过字符串访问与修改局部变量
64 0
|
2月前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
67 6
基于Python访问Hive的pytest测试代码实现
|
2月前
|
NoSQL JavaScript Java
Java Python访问MongoDB
Java Python访问MongoDB
22 4
WK
|
2月前
|
存储 安全 索引
如何在Python中访问字典中的值
在Python中,访问字典(Dictionary)中的值非常简单。字典是一种无序的集合,它存储了键值对(key-value pairs),其中每个键都是唯一的,并映射到一个值上。要访问字典中的值,你需要使用键作为索引。
WK
28 0
|
3月前
|
Python
Python 中的 self 是什么?
【8月更文挑战第29天】
149 5
|
3月前
|
程序员 数据库连接 API
分享一个解决 EF 性能低的思路,通过 Python 访问心跳侦测 API 保持 EF 在线
分享一个解决 EF 性能低的思路,通过 Python 访问心跳侦测 API 保持 EF 在线
|
3月前
|
机器学习/深度学习 开发工具 Python
【Azure 应用服务】使用Python Azure SDK 来获取 App Service的访问限制信息(Access Restrictions)
【Azure 应用服务】使用Python Azure SDK 来获取 App Service的访问限制信息(Access Restrictions)
|
3月前
|
Python Windows
【Azure 应用服务】App Service For Windows 环境中部署Python站点后,如何继续访问静态资源文件呢(Serving Static Files)?
【Azure 应用服务】App Service For Windows 环境中部署Python站点后,如何继续访问静态资源文件呢(Serving Static Files)?
|
3月前
|
存储 安全 API
【Azure Developer】Python代码通过AAD认证访问微软Azure密钥保管库(Azure Key Vault)中机密信息(Secret)
【Azure Developer】Python代码通过AAD认证访问微软Azure密钥保管库(Azure Key Vault)中机密信息(Secret)
|
3月前
|
Python Windows 内存技术
【Azure 应用服务】Azure App Service (Windows) 使用Flask框架部署Python应用,如何在代码中访问静态文件呢?如何设置文件路径?是相对路径还是绝对路径呢?
【Azure 应用服务】Azure App Service (Windows) 使用Flask框架部署Python应用,如何在代码中访问静态文件呢?如何设置文件路径?是相对路径还是绝对路径呢?