十七、python 私有化和魔法属性

1、python私有化

xx:公有变量

_x:单前置下划线,私有化属性或方法,from module import * 禁止导入,但是类对象和子类可以访问。

__xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)

__xx__:双前后下划线,用户名字空间的魔法对象或属性。

xx_:单后置下划线,用于避免与python关键词的冲突。

通过name mangling(名字重整的目的就是以防子类意外重写基类的方法或者属性)。

通过_Class__object机制可以访问private。

父类中属性名为__name的,子类不能继承,子类不能访问。

如果在子类中向__name赋值,那么会在子类中定义一个与父类相同名字的属性。

_name的变量、函数、类在使用from xxx import * 时都不会被导入。

2、魔法属性

  2.1 __doc__

    描述类的描述信息。

    

  2.2 __module__和__class__

    __module__表示当前操作的对象在哪个模块

    __class__表示当前操作的对象的类是什么

    

  2.3 __init__

    初始化方法,通过类创建对象时,自动触发执行

  2.4 __del__

    当对象在内存中被释放时,自动触发执行。

    说明:此方法一般无需定义,因为python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,__del__的调用是由解释器在进行垃圾回收时自动触发执行的。

  2.5 __call__

    对象后面加括号,触发执行。

    注:__init__方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:
    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):
        print(‘__call__‘)

obj = Foo()  # 执行 __init__
obj()  # 执行 __call__

  2.6 __dict__

    类或对象中的所有属性。

    类的实例属性属于对象,类中的类属性和方法属于类。

class Province(object):
    country = ‘China‘

    def __init__(self, name, count):
        self.name = name
        self.count = count

    def func(self, *args, **kwargs):
        print(‘func‘)

# 获取类的属性,即:类属性、方法、
print(Province.__dict__)
# 输出:{‘__dict__‘: <attribute ‘__dict__‘ of ‘Province‘ objects>, ‘__module__‘: ‘__main__‘, ‘country‘: ‘China‘, ‘__doc__‘: None, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Province‘ objects>, ‘func‘: <function Province.func at 0x101897950>, ‘__init__‘: <function Province.__init__ at 0x1018978c8>}

obj1 = Province(‘山东‘, 10000)
print(obj1.__dict__)
# 获取 对象obj1 的属性
# 输出:{‘count‘: 10000, ‘name‘: ‘山东‘}

obj2 = Province(‘山西‘, 20000)
print(obj2.__dict__)
# 获取 对象obj1 的属性
# 输出:{‘count‘: 20000, ‘name‘: ‘山西‘}

  2.7 __str__

   如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

class Foo:
    def __str__(self):
        return ‘laowang‘

obj = Foo()
print(obj)
# 输出:laowang

  2.8 __getitem__、__setitem__、__delitem__

    用于索引操作,如字典。以上分别表示获取、设置、删除数据。

class Foo(object):

    def __getitem__(self, key):
        print(‘__getitem__‘, key)

    def __setitem__(self, key, value):
        print(‘__setitem__‘, key, value)

    def __delitem__(self, key):
        print(‘__delitem__‘, key)

obj = Foo()

result = obj[‘k1‘]      # 自动触发执行 __getitem__
obj[‘k2‘] = ‘laowang‘   # 自动触发执行 __setitem__
del obj[‘k1‘]           # 自动触发执行 __delitem__

  2.9 __getslice__、__setslice__、__delslice__

    该三个方法用于分片操作,如:列表

class Foo(object):

    def __getslice__(self, i, j):
        print(‘__getslice__‘, i, j)

    def __setslice__(self, i, j, sequence):
        print(‘__setslice__‘, i, j)

    def __delslice__(self, i, j):
        print(‘__delslice__‘, i, j)

obj = Foo()

obj[-1:1]                   # 自动触发执行 __getslice__
obj[0:1] = [11,22,33,44]    # 自动触发执行 __setslice__
del obj[0:2]                # 自动触发执行 __delslice__

原文地址:https://www.cnblogs.com/nuochengze/p/12664877.html

时间: 2024-10-14 13:48:01

十七、python 私有化和魔法属性的相关文章

Python之对象的属性

# -*- coding: utf-8 -*- #python 27 #xiaodeng #Python之对象的属性 #http://python.jobbole.com/82622/ #对象的属性 class bird(): feather = True class chicken(bird): fly = False def __init__(self,age): self.age = age summer = chicken(2) print(bird.__dict__) print(ch

全栈JavaScript之路(十七)HTML5 新增字符集属性

HTML5 增加了几个文档字符集属性. document.charset : 表示文档的实际使用的字符集. document.defaultCharset: 表示默认的字符集,跟浏览器以及操作系统设置有关. 如果文档没有使用默认字符集,那么 document.charset 与 document.defaultCharset 可能不同. 设置文档字符集: 但可以通过<meta>元素.响应头部或直接设置charset 属性修改这个值.来看三个例子. <meta http-equiv=&qu

(转)Python的“黑暗魔法”,两行解一元一次方程

无意看到一个大神写的<Linear equations solver in 3 lines (Python recipe)>,Python解一元一次方程只需要三行就完成了,确实很强悍啊. 我们来围观一下: 说到底呢,这个段代码的关键是利用了复数. 第一步: 2 * x + 233 = x * 8 + 3 变成 2 * x + 233 -(x * 8 + 3) 然后把x变成虚数1j 然后变成 2 * 1j + 233 -(1j * 8 + 3) 通过eval算出结果为230-6j 因为我们知道这

Python中类的方法属性与方法属性的动态绑定

最近在学习python,纯粹是自己的兴趣爱好,然而并没有系统地看python编程书籍,觉得上面描述过于繁琐,在网站找了一些学习的网站,发现廖雪峰老师的网站上面的学习资源很不错,而且言简意赅,提取了一些python中的重要的语法和案例.重要的是可以在线测试python的运行代码,缺点就是没有系统的看python的书籍,不能及时的将知识的碎片化联系在一起,这也是看书与不看书的区别.尤其是在python类与实例的方法的调用中觉得云里雾里,思考之后将自己的想法记录下,一来加深自己理解,巩固自己记忆,而来

Python的实例定属性和方法或类绑定方法

一.给实例对象绑定属性和方法:1.给实例绑定属性:先定义一个Student类 #!/usr/bin/python class Student(object): pass 然后绑定属性: s = Student() s.name = 'AAA' # 动态给实例绑定一个属性 print(s.name)#输出AAA 2.给实例绑定方法:先定义一个方法 def add(self,a,b): self.a = a self.b = b return self.a +self.b 然后绑定方法: Metho

python中的实例属性和类属性

在python中,类属性和实例属性的区别是什么? 我认为是作用域的不同,实例对象可以访问类属性,类对象不可以访问实例属性.(类的概念本身就是作用域的概念,你不能让一只猫会飞,猫属于猫类,这一类都不会飞.所以“飞”这种方法,猫类不具有) 比如: class People(object): name = 'Tom' # 公有的类属性 __age = 12 # 私有的类属性 # 实例属性 def __init__(self,height): self.height = height p = Peopl

Python 私有化属性

# 对象的基本理论 # 什么事对象? # 万物皆对象 # 对象是具体物体 # 拥有属性 # 拥有行为 # 把很多零散的东西,封装成为一个整体 # 举例:王二小 # 属性 # 姓名 # 年龄 # 身高 # 体重 # 行为 # 走路 # 吃饭 # 放羊 # Python中的体现 # 是一门特别彻底的面向对象编程(OOP)的语言 # 其他语言:基本数据类型,对象类型 # python全部类型都是对象类型 # 面向对象是面向过程的封装 # 对象和类的关系:对象 可以抽象为类 类可以实例化为对象 clas

python魔法属性

1.__doc__:表示类的描述信息 1 class Person(object): 2 '''定义人的类''' 3 def func(self): 4 pass 5 6 print(Person.__doc__) 7 结果为:定义人的类 2.__module__ :表示当前操作的对象在那个模块 __class__ :表示当前操作的对象的类是什么 #定义一个test.py文件,键入如下代码: class Person(object): def __init__(self): self.name

Python高级语法-私有属性-魔法属性(4.7.2)

目录 1.说明 2.代码 关于作者 @ 1.说明 常用的一些魔法方法如下 所谓魔法方法,就是调用的时候 不好好正常调用 2.代码 class Test: """ 我是___doc____ """ class_index = 0 def __init__(self,index): self.index = index print("index") def __call__(self, *args, **kwargs): prin