06-2 | 面向对象-访问控制和属性装饰器

逸兴
逸兴
逸兴
57
文章
25
评论
2020-04-2621:42:081 1483字阅读4分56秒

私有属性

类属性,方法前面加__, 转为私有属性,普通访问不到。

只有在类内部设置才生效。

06-2 | 面向对象-访问控制和属性装饰器

通过 __dict__ 可以看到,私有属性的标识符前面添加了 _类名

06-2 | 面向对象-访问控制和属性装饰器

实例外,在属性或方法前面加上 _类名 即可访问。

实例内部,通过字面意思可以直接访问。

06-2 | 面向对象-访问控制和属性装饰器
在类内部访问,可直接访问私有属性。其实在解析时 会自动补上 _Class 来进行访问。写在哪个类中,就加哪个 _Class , 是写在哪个类中,就按照哪个改名。

另外, 在python社区中约定,_开头的成员,是保护成员,不可修改。也只是社区中约定,python语言并没有任何限制。

成员:属性和方法。

对于这种使用属性, 通常是不想让别人访问到, 如果要访问或修改可以专门写个方法进行, 如下:

# encoding = utf-8
__author__ = "hugbg.com"


class Person:
    def __init__(self, name, age=19):
        self.name = name
        self.__age = age    #__age 就是一个私有属性
                            # 封装
    def get_age(self):      # 定义一个方法, 专门用来获取 age值
        return self.__age

    def set_age(self, value):   # 专门用来修改age
        self.__age = value


tom = Person('tom')

print('{} is {}'.format(tom.name, tom.get_age()))   # tom is 19

tom.set_age(30)

print(tom.get_age())    # 30
06-2 | 面向对象-访问控制和属性装饰器

属性装饰器

属性装饰器的作用,是将一个方法,当做一个属性来访问,另外还提供了一个修改方法的接口。

如下:隐藏age数据,实例访问age和修改age可通过特定方法进行

class Person:
    def __init__(self, name, age=18):
        self.name = name
        self.__age = age       # 通过私有属性,隐藏了内部数据,同时提供相应的接口来访问修改属性 --- 封装

    def get_age(self):      
        return self.__age

    def set_age(self, value):
        self.__age = value

tom = Person('Tom')

# 获得age
print(tom.name, tom.get_age())

# 修改age
tom.set_age(100)
print(tom.name, tom.get_age())
06-2 | 面向对象-访问控制和属性装饰器

使用property 装饰后

@property的作用是将方法转换成属性。

06-2 | 面向对象-访问控制和属性装饰器
06-2 | 面向对象-访问控制和属性装饰器

此外还有删除功能:

06-2 | 面向对象-访问控制和属性装饰器
06-2 | 面向对象-访问控制和属性装饰器

运行 del tom.age 时, 其实是调用的age.deleter

装饰器属性有两种调用方式:

先用property装饰某个方法, 然后这个方法可以当做属性调用, 然后通过setter 设置属性的值, 通过deleter删除属性。

如果不定义setter, 则这个属性不能修改, 为只读属性。

setter 和 deleter不能单独使用, 必须结合@ property使用。

06-2 | 面向对象-访问控制和属性装饰器

第二种方法:

06-2 | 面向对象-访问控制和属性装饰器

tom.age 和 tom.get__age() 可以同时使用。

当 age.setter 有更复杂的传参时,参数大于一, 只能使用tom.set_age(value, a, b, c)进行传参, 此时使用tom.age = value 的方式时, set_age(value, a=1, b=2, c=3) 必须有缺省值

1、随机整数生成类
可以先设定一批生成数字的个数,可设定指定生成的数值的范围。运行时还可以调整每批生成数字的个数

2、打印坐标
使用上题中的类,随机生成20个数字,两两配对形成二维坐标系的坐标,把这些坐标组织起来,并打印输出




https://www.hugbg.com/archives/2501.html
逸兴
  • 本文由 发表于 2020-04-2621:42:08
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
07-6 | 反射 面向对象

07-6 | 反射

在运行时,通过反射可以获得一个对象的名字,类型等一切特征信息。或者自省。 反射相关的内建函数 # encoding = utf-8 __author__ = "wwww.mcabana.com" cl...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

评论:1   其中:访客  1   博主  0
    • 浮光 浮光

      我追着你,因为我爱你 —原创