day28学习整理-python面向对象(进阶)

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

二、反射

反射就是通过字符串来操作类或者对象的属性

  • 反射本质就是在使用内置函数,其中反射有以下四个内置函数:
  1. hasattr:判断一个方法是否存在与这个类中
  2. getattr:根据字符串去获取obj对象里的对应的方法的内存地址,加"()"括号即可执行
  3. setattr:通过setattr将外部的一个函数绑定到实例中
  4. 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')

转载于:https://www.cnblogs.com/Wunsch/p/11448580.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值