title: python _、和__xx
top: 41
date: 2021-08-02 11:19:39
tags:
- 小知识
categories:
- python
_xx 单下划线开头
Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范.
#!/usr/bin/env python
# coding:utf-8
class Test():
def __init__(self):
pass
def _one_underline(self): # 定义私有方法,都只能被类中的函数调用,不能在类外单独调用
print "_one_underline"
def __two_underline(self): # 防止类被覆盖,都只能被类中的函数调用,不能在类外单独调用
print("__two_underline")
def output(self):
self._one_underline()
self.__two_underline()
if __name__ == "__main__":
obj_test=Test()
obj_test.output()
'''
#输出结果为:
localhost:attempt_underline a6$ python undeline.py
_one_underline
__two_underline
'''
"__"双下划线
这个双下划线更会造成更多混乱,但它并不是用来标识一个方法或属性是私有的,真正作用是用来避免子类覆盖其内容。我们创建一个以"__"两个下划线开始的方法时,这意味着这个方法不能被重写,它只允许在该类的内部中使用。
#!/usr/bin/env python
# coding:utf-8
class A(object):
def __method(self):
print("I'm a method in A")
def method(self):
self.__method()
class B(A):
def __method(self):
print("I'm a method in B")
if __name__ == "__main__":
a = A()
a.method()
b = B()
b.method()
'''
# 输出结果为:
localhost:attempt_underline a6$ python undeline.py
I'm a method in A
I'm a method in A
'''
"__xx__
"前后各双下划线
“__xx__
”经常是操作符或本地函数调用的magic methods。类属性可以来自类自定义自身,也可能根据类定义继承的,一个对象的属性还可能是该对象的实例定义的,叫做对象属性。对象的属性储存在对象的__dict__
属性中,__dict__
为一个词典,键为属性名,对应的值为属性本身。
属性:
__doc__:帮助说明,将字符串写在对象定义声明之下
__module__:模块名,就是文件的名字(无后缀)部分
__class__:返回对象的类信息
__dict__:存储对象属性/方法的字典
__slots__:设置一个元祖,限定允许绑定的属性名称(不能动态添加以外的属性),
只能对当前类起效,对子类不起效(除非在子类中也定义__slots__),这样,子类
允许定义的属性就是自身的__solots__加上父类的__slots__
############################################################
类的专有方法:
__init__: 构造函数,在生成对象时调用
__del__: 析构函数,释放对象时使用
__repr__: 打印 转换
__setitem__: 按照索引赋值
__getitem__: 按照索引获取值
__len__: 获得长度
__cmp__: 比较运算
__call__: 函数调用
__add__: 加运算
__sub__: 减运算
__mul__: 乘运算
__div__: 除运算
__mod__: 求余运算
__pow__: 乘方
# example 1
class CrazyNumber(object):
def __init__(self, n):
self.n = n
def __add__(self, other):
return self.n - other
def __sub__(self, other):
return self.n + other
def __str__(self):
return str(self.n)
num = CrazyNumber(10)
print(num) # 10
print(num + 5) # 5
print(num - 20) # 30
# example 2
class Room(object):
def __init__(self):
self.people = []
def add(self, person):
self.people.append(person)
self.people.append(person)
self.people.append(person)
def __len__(self):
return len(self.people)
room = Room()
room.add("Igor")
print(len(room)) # 3
参考链接
>