第十三周博客之面向对象编程4

内置函数issubclass()用于判断类对象与类对象之间的关系。
内置函数issubclass()用于判断实例对象与类对象之间的关系。

内置函数issubclass接收两个实参,
第一个实参是类对象,
第二个实参是类对象或由类对象组成的元组,

当第二个实参是类对象时,如果第一个实参是第二个实争的子类,那么退回True,
当第二个实参是类对象组成的元组时,如果第一个实参是第二个实参中任意一个类对象的子类,则返回True

class A(object):
	pass
class B(object):
	pass
class C(object):
	pass
class D(A):
	pass

print(issubclass(D,A))
print(issubclass(D,B))
print(issubclass(D,(B,A,C)))
print(issubclass(D,(B,C)))
print(issubclass(bool,int))
print(issubclass(bool,str))
print(issubclass(bool,(str,int,dict)))
print(issubclass(bool,(str,list,dict)))

True
False
True
False
True
False
True
False

type()获取指定对象的类型
class MyClass(object):
    pass
mc = MyClass()
print(type(mc))
<class '__main__.MyClass'>

print(type(18))
<class 'int'>

print(type(MyClass))
<class 'type'>

print(type(int))
<class 'type'>

#所有类对象的type就是type
def do_sth():
    pass
print(type(do_sth))#函数的类型是function
<class 'function'>

print(type(dir))#内置函数的类型是
<class 'builtin_function_or_method'>

可以使用运算符==判断某个对象的类型是否是指定的类型
对于基本数据类型,可直接使用其对应的类名,如果不是基本数据类型,需要使用标准库中的模块types中定义的变量

print(type(18) == int)
True

print(type(do_sth)== function)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-15-a52053de46b4> in <module>
----> 1 print(type(do_sth)== function)

NameError: name 'function' is not defined


print(type(print)== builtin_function_or_method)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-16-d970e74506af> in <module>
----> 1 print(type(print)== builtin_function_or_method)

NameError: name 'builtin_function_or_method' is not defined

import types
print(type(do_sth)== types.FunctionType)
print(type(print)== types.BuiltinFunctionType)
True
True
dir()

#对于制定的类对象或实例对象,可以调用函数dir()获得其所有可以访问的属性和方法(包括从父类中继承的属性和方法)的列表
类对象与实例对象的结果是有区别的,类对象的结果中不包括实例属性

class MyClass(object):
	ca = 'ca'
   def __init__(self):
        self.ia = 'ia'
    
    def im(self):
        pass
    
    @classmethod
    def cm(cls):
        pass
    
    @staticmethod
    def sm():
        pass
        
print(dir(MyClass))
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ca', 'cm', 'im', 'sm']
print(dir(MyClass()))
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ca', 'cm', 'ia', 'im', 'sm']
属性之增删改查
hasattr()
getattr()
setattr()
delattr()
hasattr(object,name)

  用于获取指定的对意Robject中名为name的属性或方法。

  如来不地fat么ae的展性理方料mtgetattr(object,name)等价于: object.name,3”setattrfobject, ane, vaLue)

  4. detattrlobject, name--用于在持定的对最biect中添加度督改名为参数me的属性或方法, 系加或修改后的值vl.setattrlobiecL nane value)等价于bject.name三value,

  用于删除指定的对象bject中名为参数name的属性或方法。delattrlobject, name)等价于: del object. name。

  注意只有在不知道对象信息的情况下,才会去获取对象的信息。因此,如果可以直接写: object.name,就不要写为getattr(object, ↑ name' )。


class MyClass(object):
	def __init__(self):
    	self.x = 1

    def do_sth(self):
	    print('do_sth被调用')
    
mc = MyClass()

print(hasattr(mc,'x'))
print(hasattr(mc,'do_sth'))
print(hasattr(mc,'y'))
True
True
False

print(getattr(mc,'x'))
1

print(getattr(mc,'y'))
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-34-ee6c76a7fba4> in <module>
----> 1 print(getattr(mc,'y'))

AttributeError: 'MyClass' object has no attribute 'y'
print(getattr(mc,'y',2))
2

print(getattr(mc,'y','查找的属性或方法不存在'))
查找的属性或方法不存在

setattr(mc,'z',3)
print(getattr(mc,'z'))
3

delattr(mc,'z')
print(hasattr(mc,'z'))
False

算术运算符重载
自己定义的类可以用加法来做

class MyClass1(object):
    pass

class MyClass2(object):
    pass
print(MyClass1()+MyClass2())#标准算术运算符在默认情况下不能用于自定义类对象的实例对象,
                            #必须在自定义类对象中实现标准算数运算符对应的以下特殊方法
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-39-ce5056f11b9c> in <module>
----> 1 

print(MyClass1()+MyClass2())
NameError: name 'MyClass1' is not defined

#标准算术运算符在默认情况下不能用于自定义类对象的实例对象,
#必须在自定义类对象中实现标准算数运算符对应的以下特殊方法

  1. +对应的特殊方法是__add__()和__radd__();
  2. -对应的特殊方法是__sub__()和__rsub__();
  3. *对应的特殊方法是__mul__()和__rmul__();
  4. /对应的特殊方法是__truediv__()和__rtruediv__()
  5. //对应的特殊方法是__floordiv__()和__rfloordiv__()
    在这里插入图片描述

实例化对象在运算符的右边要用到r的那边
先看左边的调用对象有没有方法,有的话直接调用,两个都没有就报错
class MyClass1(object):
def add(self,other):
return '这是__add__+的结果’

class MyClass2(object):
def radd(self,other):
return '这是__radd__+的结果’

obj1 = MyClass1()
obj2 = MyClass2()
print(obj1 + obj2)
File “”, line 3
return '这是__add__+的结果’
^
SyntaxError: EOL while scanning string literal
str()与__repr__()
用于并返回实例对象的字符串表示形式
#第一系列
class MyClass(object):
pass

mc = MyClass()
mc
<main.MyClass at 0x1baf17000f0>
print(mc)
<main.MyClass object at 0x000001BAF17000F0>
str(mc)
‘<main.MyClass object at 0x000001BAF17000F0>’
repr(mc)
‘<main.MyClass object at 0x000001BAF17000F0>’
#第二系列
class MyClass(object):
def str(self):
return ‘__str__被调用’

mc = MyClass()
mc
<main.MyClass at 0x1baf1700b70>
print(mc)

__str__被调用
str(mc)
‘__str__被调用’
repr(mc)
‘<main.MyClass object at 0x000001BAF1700B70>’
#repr比str管的多

类对象的特殊方法之__ str__ ()和__ repr__ ()用于自定义并返回实例对象的字符串表示形式。
1.当在交互式命令行中直接打印一个实例对象时,如果在实例对象对应的类对象中实现了特殊方法__repr__(), 会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址。
2.当调用内置函数print打印一个实例对象时,如果在实例对象对应的类对象中实现了特殊方法_ str__ (), 会自动调用该方法;否则,如果在实例对象对应的类对象中实现了特殊方法_ repr__ (), 会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址。
3,当调用内置函数str创建字符串并且实参是-一个实例对象时,如果在实例对象对应的类对象中实现了特殊方法__ str__ (), 在内置函数st r的内部会自动调用该方法;否则,如果在实例对象对应的类对象中实现了特殊方法__ repr__ (), 在内置函数str的内部会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址。
4.当调用内置函数repr创建字符串并且实参是一个实例对象时,如果在实例对象对应的类对象中实现了特殊方法__ repr__ (), 在内置函数repr的内部会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址。通常情况下,类对象的特殊方法_ str_ ()和__ repr__ ()的实现代码是一 样的,因此,当实现了其中一个后,可以把其方法名赋值给另一个的方法名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值