Python 面向对象(3)

 本篇主要为Python中类的私有属性内容。

目录

场景

类私有属性

设置私有属性

访问私有属性

私有属性赋值

私有属性对比

私有属性说明

操作私有属性

__属性__

_属性

总结


场景

所有的变量都可被外部调用和修改,这样是不安全的。怎么解决呢?设置类的私有属性。

类私有属性

如果要让类的内部属性不被外部直接访问,可以通过在属性前增加两个下划线:”__属性”。

在python中如果在属性前加两个下划线,就表示这个属性变成了私有属性。

设置私有属性

对Person类增加一个money属性,然后实例化类并打印money属性。

示例如下:

class Person(object):
    name = ''
    age = 0
    gender = 0
    height = 0
    weight = 0
    __money = 1000

 

访问私有属性

示例如下:

person1 = Person()
print(person1.__money)

执行结果:

Traceback (most recent call last):
  File "E:\lianxipy\day6\访问限制.py", line 12, in 
    print(person1.__money)
AttributeError: 'Person' object has no attribute '__money'

外部已经无法访问了,提示:对象中没有这个属性。

私有属性赋值

如果我们在实例化对象后,首先给私有属性赋值,再访问就发现一个奇妙的事情:

这时候能访问私有属性了。

示例如下:

person1 = Person()
person1.__money = 10
print(person1.__money)

# 执行结果
# 10

私有属性对比

但其实我们访问的是对象设置的__money属性,并不是类的私有属性。

可通过在__init__()中打印类私有属性值与外部赋值的进行对比,发现确实如此。

示例如下:

class Person(object):
    name = ''
    age = 0
    gender = 0
    height = 0
    weight = 0
    __money = 1000

    def __init__(self):
        print(self.__money)

person1 = Person()
person1.__money = 10
print(person1.__money)

# 执行结果:
# 1000
# 10

私有属性说明

Python的类私有属性并不是真正的无法访问了,只是它把变量改变了名称,通过这种方式把私有属性隐藏起来使外部无法直接访问。

这时候可以通过”_类名__属性”的方式进行访问,不建议用这种方式直接访问,因为不同的解释器变量名称可能不同。再说本来就设置成私有属性,如果还是直接访问岂不是多此一举。

在这里只是为了了解python私有属性的特性。

示例如下:

person1 = Person()
print(person1._Person__money)

# 执行结果
# 1000

查看执行结果,已经访问到刚才设置的私有属性值。

操作私有属性

当前外部无法直接访问和设置私有属性值,

通过自定义内部的方法实现对私有属性的赋值和取值。

示例如下:

# 获取类私有属性
print(person1.get_money())
# 设置类私有属性
person1.set_money(100)
# 在获取类私有属性
print(person1.get_money())

# 执行结果
# 1000
# 100

__属性__

在python中__xxx__属于特殊变量,可以直接访问。

但是按照约定规则,请把它当做私有变量不要直接访问。

示例如下:

class Person(object):
    name = ''
    __age__ = 0
    gender = 0
    height = 0
    weight = 0
    __money = 1000
person1 = Person()
print(person1.__age__)

 

_属性

在python中_xxx变量,这样的实力变量外部可以直接访问,意为受保护的属性。

编译器中不提示类有此属性,且有受保护提示。

示例如下:

class Person(object):
    name = ''
    __age__ = 0
    _gender = 0
    height = 0
    weight = 0
    __money = 1000

person1 = Person()
print(person1._gender)

当打印时提示:

Access to a protected member _gender of a class

总结

本篇主要为Python中类的私有属性内容。

你可能感兴趣的:(Python,python,开发语言,后端)