一、特殊属性
1、
魔术方法名称 | 功能 |
---|---|
方法__name__ | 类、函数、方法等的名字 |
方法__module__ | 类定义所在的模块 |
方法__class__ | 对象或类所属的类 |
方法__bases__ | 当前类的基类(父类) |
方法__doc__ | 类、函数的文档帮助,没有定义为None |
方法__mro__ | Method Resolution Order 方法解析顺序 |
方法__dict__ | 类或实例的属性,可写的字典 |
2、dir__返回类或者对象的所有成员名称列表。dir()函数就是调用__dir()。
- 如果dir([obj])参数包含方法__dir__(),该方法将被调用。
- 如果Obj不包含__dir__(),该方法将最大限度收集属性信息。
3、dir(obj) 对于不同类型的对象obj具有不同的行为:
1).如果对象是模块对象,返回的列表包含模块的属性名和变量名
2).如果对象是类型或者类对象,返回的列表包含类的属性名,及它的基类的属性名
3).如果obj不写 即dir(),返回列表包含内容不同
- 在模块中,返回模块的属性和变量名
- 在函数中,返回本地作用域的变量名
- 在方法中,返回本地作用域的变量名
from collections import Counter
class A(object):
pass
class C(object):
pass
class Date(A, C):
"""
时间类的封装
"""
country = 'china'
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
def __dir__(self):
return {'country': self.country}
print(Date.__name__)
# 类定义所在的模块, 如果在当前脚本, 返回__main__, 否则, 返回真实的模块名eg: collections
print(Date.__module__)
print(Counter.__module__)
# 对象或类所属的类: 是由哪个类实例化出来的;
d = Date(2019, 10, 10)
print(d.__class__) # d对象是由Date类实例化出来的;
print(Date.__class__) # type(1)Date类是由type类实例化出来的; Python中一切皆对象; 看到的类实质上也是对象;
# 当前类的基类(父类)
print(Date.__bases__)
print(A.__bases__)
print(object.__bases__) # object没有父类;
# 类、函数的文档帮助,没有定义为None
print(Counter.__doc__)
print(Date.__doc__)
# Method Resolution Order 方法解析顺序, 实质上是显示类的继承顺序; python3中多继承的算法是广度优先
print(Date.__mro__)
# 类或实例的属性,可写的字典
print(Date.__dict__)
print(dir(Date))
print(dir())
def add(x, y):
print(dir())
return x + y
add(1, 2)
二、创建、初始化与销毁
这三者的区别__new__ ,init , del
1、new 的功能是在生成对象之前所做的动作,接受的是cls类,负责对象的创建
2、__init__是在对象生成之后完善对象的属性,它接受的是self对象,负责对象的初始化
3、对象生成是在new里面return(返回一个对象)
class Student(object):
def __new__(cls, name):
print('正在new.....')
# 不知道new方法试药干吗的, 直接返回父类的new方法
return super(Student, cls).__new__(cls)
# 初始化(构造)方法: 创建对象时自动执行
def __init__(self, name):
print("正在初始化对象.....")
self.name = name
# 析构方法: 对象删除时自动调用
def __del__(self):
print("正在删除对象.....")
# 当程序运行结束之后, 会自动释放变量信息. 会自动调用析构方法;
s = Student('westos')
print(s.name)
三、可视化
1、类型判断要使用type或sinstance,不能通过判断print输出是否带来引号来判断输出值的类型
1)str()与reper()都是python中的内置函数,是直接用来格式化字符串的函数
2)而__str__与__reper__是在类(对象)中对类(对象)本身进行字符串处理。
2、str:返回一个可以用来表示对象的可打印的友好的字符串
- 对字符串,返回本身
- 没有参数,则返回空字符串
- 对类,可通过__str__()成员控制其行为。改成员不存在,则使用其__repr__()成员。
四、类型转换
代码案例
class Password(object):
def __init__(self, url, pwd):
self.url = url
self.pwd = pwd
self.count = 10
# int(对象名)会自动调用
def __int__(self):
return int(self.count)
def __float__(self):
return float(self.count)
p1 = Password('www.baidu.com', 'westos')
print(int(p1))
print(float(p1))
五、索引与切片
例:
class Student(object):
def __init__(self,name,scores):
self.name = name
self.scores = scores
def __getitem__(self, item):
print(item,type(item))
return self.scores[item]
def __setitem__(self, key, value):
self.scores[key] = value
def __delitem__(self, key):
del self.scores[key]
liming = Student('liming',[100,89,100,70])
#索引值的获取
print('索引值的获取')
print(liming[0])
print(liming[1])
#索引值的修改
print('索引值的修改')
liming[0] = 79
print(liming[0])
#索引值的删除
print('索引值的删除')
del liming[0]
print(liming[0])
print('切片操作')
print(liming[:2])
#切片修改
liming[:2] = [1,2,3]
print(liming.scores)
#切片删除
del liming[:2]
print(liming.scores)
六、重复、连接与成员操作符
例:
class Student(object):
def __init__(self,name,scores):
self.name = name
self.scores = scores
def __mul__(self, other):
return [i*other for i in self.scores]
def __add__(self, other):
return self.scores + other.scores
def __contains__(self, item):
return item in self.scores
liming = Student('liming',[100,90,100])
#进行重复操作
print(liming*3)
#连接操作
xiaohong = Student('xiaohong',[1,2,3])
print(xiaohong + liming)
#成员操作符
print(100 in liming)
print(1 in liming)
print(2 in xiaohong)
七、循环
例:
class Student(object):
def __init__(self,name,scores):
self.name = name
self.scores = scores
def __iter__(self):
return iter(self.scores)
liming = Student('liming',[100,90,100,80])
for item in liming:
print(item)
八、with语句安全上下文
例:
class Myopen(object):
def __init__(self,name,mode='r'):
self.name = name
self.mode = mode
def __enter__(self):
#当with语句进入并开始执行的时候,执行之后的内容需要一个返回对象,在执行结束后关闭或者执行其他的操作
self.f = open(self.name,self.mode)
print('正在打开文件........',self.mode)
return self.f
def __exit__(self, exc_type, exc_val, exc_tb):
#当with执行结束时,做什么操作。
self.f.close()
print('正在关闭文件......')
with Myopen('passwd') as f:
print(f.read())
九、魔术方法汇总
基本的魔术方法
有关属性的魔术方法
比较操作符
算法运算符
反运算
增量赋值运算
一元操作符
类型转换
上下文管理(with语句)
容器类型