目录
2019/09/02 学习整理
python面向对象(进阶)
一、issubclass和ininstance
issubclass
issubclass方法用于判断参数 class 是否是类型参数 classinfo 的子类。
语法
以下是 issubclass() 方法的语法:
issubclass(class, classinfo)
参数
- class -- 类。
- classinfo -- 类。
返回值
如果 class 是 classinfo 的子类返回 True,否则返回 False。
class A:
pass
class B(A):
pass
print(issubclass(B,A)) # 返回 True
ininstance
isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
isinstance() 与 type() 区别:
- type() 不会认为子类是一种父类类型,不考虑继承关系。
- isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。
语法
以下是 isinstance() 方法的语法:
isinstance(object, classinfo)
参数
- object -- 实例对象。
- classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。
返回值
如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。。
class A:
pass
class B(A):
pass
isinstance(A(), A) # returns True
type(A()) == A # returns True
isinstance(B(), A) # returns True
type(B()) == A # returns False
二、反射
反射就是通过字符串来操作类或者对象的属性
- 反射本质就是在使用内置函数,其中反射有以下四个内置函数:
- hasattr:判断一个方法是否存在与这个类中
- getattr:根据字符串去获取obj对象里的对应的方法的内存地址,加"()"括号即可执行
- setattr:通过setattr将外部的一个函数绑定到实例中
- delattr:删除一个实例或者类中的方法
hasattr:
hasattr() 函数用于判断对象是否包含对应的属性。
语法
hasattr 语法:
hasattr(object, name)
参数
- object -- 对象。
- name -- 字符串,属性名。
返回值
如果对象有该属性返回 True,否则返回 False。
class Coordinate:
x = 10
y = -5
z = 0
point1 = Coordinate()
print(hasattr(point1, 'x')) #True
print(hasattr(point1, 'y')) #True
print(hasattr(point1, 'z')) # True
print(hasattr(point1, 'no')) # False
getattr:
getattr() 函数用于返回一个对象属性值。
语法
getattr 语法:
getattr(object, name[, default])
参数
- object -- 对象。
- name -- 字符串,对象属性。
- default -- 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。
返回值
返回对象属性值。
>>>class A(object):
... bar = 1
...
>>> a = A()
>>> getattr(a, 'bar') # 获取属性 bar 值
1
>>> getattr(a, 'bar2') # 属性 bar2 不存在,触发异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'bar2'
>>> getattr(a, 'bar2', 3) # 属性 bar2 不存在,但设置了默认值
3
setattr:
setattr() 函数对应函数 getattr(),用于设置属性值,该属性不一定是存在的。
语法
setattr() 语法:
setattr(object, name, value)
参数
- object -- 对象。
- name -- 字符串,对象属性。
- value -- 属性值。
返回值
无。
对已存在的属性进行赋值:
>>>class A(object):
... bar = 1
...
>>> a = A()
>>> getattr(a, 'bar') # 获取属性 bar 值
1
>>> setattr(a, 'bar', 5) # 设置属性 bar 值
>>> a.bar
5
如果属性不存在会创建一个新的对象属性,并对属性赋值:
>>>class A():
... name = "runoob"
...
>>> a = A()
>>> setattr(a, "age", 28)
>>> print(a.age)
28
>>>
delattr:
delattr 函数用于删除属性。
delattr(x, 'foobar') 相等于 del x.foobar。
语法
delattr 语法:
delattr(object, name)
参数
- object -- 对象。
- name -- 必须是对象的属性。
返回值
无。
class Coordinate:
x = 10
y = -5
z = 0
point1 = Coordinate()
print('x = ',point1.x)
print('y = ',point1.y)
print('z = ',point1.z)
delattr(Coordinate, 'z')
print('--删除 z 属性后--')
print('x = ',point1.x)
print('y = ',point1.y)
# 触发错误
print('z = ',point1.z)
('x = ', 10)
('y = ', -5)
('z = ', 0)
--删除 z 属性后--
('x = ', 10)
('y = ', -5)
Traceback (most recent call last):
File "test.py", line 22, in <module>
print('z = ',point1.z)
AttributeError: Coordinate instance has no attribute 'z'
三、内置方法(魔法函数)
__str__
学过的 __init__
__str__ :如果不重写 __str__ print打印会打印出内存地址
如果重写了,会打印出你想要的
__repr__ 跟str类似,在交互式命令下直接写变量名,会执行 __repr__
call
在Python中,一个特殊的魔术方法call可以让类的实例的行为表现的像函数一样。
允许一个类的实例像函数一样被调用。实质上说,这意味着 x() 与 x._call_() 是相同的。注意 call 参数可变。这意味着你可以定义 call 为其他你想要的函数,无论有多少个参数。call 在那些类的实例经常改变状态的时候会非常有效。调用这个实例是一种改变这个对象状态的直接和优雅的做法。
断点调试
一等公民:只要可以吧一个东西赋值给一个变量,这个东西就叫一等公民
在想要加断点的地方用鼠标点击一下,你会看到一个红色圆圈
变红的地方,程序执行到,就会暂停
断电应该加载报错之前
绿色箭头表示快速跳到下一个断点执行
控制台报错,点击你能看懂的最后一行,光标会快速定位到错误代码,在错误代码上放,加断电,断点调试
def test5():
return 'lqz'
def test3():
print('3333')
def test():
def test2():
test3()
i=900
i=test5()
if i>100:
print('大于100')
# print(i)
print(i)
return test2
print('xxxx')
print('第一句话')
#这个函数内部出错
test()()
print('4444')