Python基本语法总结(二)

下划线说明

  • 头尾双下划线
    例如__init__(),定义的是特殊方法,一般是系统定义名字
  • 双下划线
    以双下划线开头的变量为类的私有变量(private),只允许这个类本身访问,例如__var
  • 单下划线
    以单下划线开头的变量为保护类型的变量(protected),只允许这个类和其子类访问

Python不允许实例化对象访问类的私有数据,但是可以利用object._className__attr来访问属性,例如:

>>> class MyClass():
	__var=10

	
>>> c=MyClass()
>>> c.__var
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    c.__var
AttributeError: 'MyClass' object has no attribute '__var'
>>> c._MyClass__var
10
>>> 

内置类属性

  • __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
  • __doc__ :类的文档字符串
  • __name__: 类名
  • __module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
  • __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
>>> class MyClass():
	'这是类的文档'
	publicVar=10
	def __init__(self,varA,varB):
		self.varA='aa'
		self.varB='bb'
	def displayVar(self):
		print('varA =',self.varA)
		print('varB =',self.varB)
		print('publicVar=',MyClass.publicVar)
>>> MyClass.__doc__     # 类的文档字符串
'这是类的文档'
>>> MyClass.__name__    # 类名
'MyClass'
>>> MyClass.__module__  # 类定义所在的模块
'__main__'
>>> MyClass.__bases__   # 类的父类,默认所有类继承自object类
(<class 'object'>,)
>>> MyClass.__dict__    # 类的属性,返回一个字典
mappingproxy({'__module__': '__main__', '__doc__': '这是类的文档', 'publicVar': 10, '__init__': <function MyClass.__init__ at 0x000002B6A05AB670>, 'displayVar': <function MyClass.displayVar at 0x000002B6A05AB700>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>})
>>> 

基本重载方法

可以在自己的类中重写方法

方法名 描述
__init__(self[,args..]) 构造函数
__del__(self) 析构函数
__repr__(self) 转化为供解释器读取的形式
__str__(self) 将值转化为适于人阅读的形式
__cmp__ (self,x) 对象比较
__getitem__(self,n) 通过下标访问
__call__(self) 直接对实例进行调用
__iter__(self) 返回可迭代对象
class Fib(object):
    def __getitem__(self, n):
        if isinstance(n, int): # n是索引
            a, b = 1, 1
            for x in range(n):
                a, b = b, a + b
            return a
        if isinstance(n, slice): # n是切片
            start = n.start
            stop = n.stop
            if start is None:
                start = 0
            a, b = 1, 1
            L = []
            for x in range(stop):
                if x >= start:
                    L.append(a)
                a, b = b, a + b
            return L

>>> f=Fib()
>>> f[0]
1
>>> f[1]
1
>>> f[2]
2
>>> f[1:5]
[1, 2, 3, 5]
>>> f[:10]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>>> 

>>> class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1 # 初始化两个计数器a,b

    def __iter__(self):
        return self # 实例本身就是迭代对象,故返回自己

    def __next__(self):
        self.a, self.b = self.b, self.a + self.b # 计算下一个值
        if self.a > 100000: # 退出循环的条件
            raise StopIteration()
        return self.a # 返回下一个值

>>> for n in Fib():
	print(n)

	
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
>>> 

对象销毁机制

Python 使用了引用计数这一简单技术来跟踪和回收垃圾,当一个对象没有被引用时就会被自动释放,但是释放并不是立即的,而是解释器在合适的时机将垃圾对象的内存回收。


>>> class MyClass():
	def __del__(self):
		print('delete this object')
	def __init__(self):
		print('init this object')

	
>>> c= MyClass()    # 引用为1
init this object
>>> b=c     # 引用为2
>>> d=b     # 引用为3
>>> del c   # 引用为2
>>> del b   # 引用为1
>>> del d   # 引用为0   准备释放内存
delete this object
>>> 

利用内置函数访问属性

可以使用以下函数的方式来访问属性:

  • getattr(obj, name[, default]) : 访问对象的属性。
  • hasattr(obj,name) : 检查是否存在一个属性。
  • setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一-个新属性。
  • delattr(obj, name) : 删除属性。

hasattr(emp1, 'age')    # 如果存在 'age' 属性返回 True。
getattr(emp1, 'age')    # 返回 'age' 属性的值
setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8
delattr(emp1, 'age')    # 删除属性 'age'
# 属性名记得加单引号,否则会认为是一个与属性名同名的变量

>>> class MyObject(object):
     def __init__(self):
         self.x = 9
     def power(self):
         return self.x * self.x

>>> obj=MyObject()
>>> hasattr(obj,'x')	# 是否有属性x
True
>>> obj.x
9
>>> hasattr(obj,'y')	# 是否有属性y
False
>>> setattr(obj,'y',10)	# 设置属性y=10
>>> hasattr(obj,'y')	# 是否有属性y
True
>>> getattr(obj,'y')	# 获取属性y
10
>>> obj.y
10
>>> getattr(obj,'z')	# 若不存在对应属性且缺省为None,直接获取属性会报错
Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    getattr(obj,'z')
AttributeError: 'MyObject' object has no attribute 'z'
>>> getattr(obj,'z',404)	# 若不存在属性z,则将其设为404
404
>>> hasattr(obj,'power')
True
>>> func=getattr(obj,'power')	# 获取方法
>>> type(func)	# func类型为方法
<class 'method'>
>>> func()
81
>>> 


posted @ 2020-09-04 14:09  海物chinono  阅读(184)  评论(0)    收藏  举报