Python基础(11)-面向对象编程-(获取对象信息和属性)

本文介绍了Python中如何使用type(), isinstance(), dir(), getattr(), setattr() 和 hasattr() 进行类型判断及对象属性的操作方法,并提供了实例代码。

使用type()

使用type(xxx)函数可以判断基本数据类型和自定义数据类型:

>>> a=10
>>> type(a)
<class 'int'>
>>> type(int)
<class 'type'>
>>> type(dog)
<class '__main__.Dog'>
>>> type(fun)
<class 'function'>

使用types模块

>>> def f():
    pass
>>> type(f)
<class 'function'>
>>> import types
>>> type(f)==types.FunctionType
True
>>> type(for n in range(10))
SyntaxError: invalid syntax
>>> type((x for x in range(10)))
<class 'generator'>
>>> type((x for x in range(10)))==types.GeneratorType
True

所以模块types包含了函数类型,可以用type()和其比较,进行判断

使用isinstance()

使用方法:
1. isinstance(x, Class)判断x是否是Class类型的,比如:

>>> isinstance(1,int)
True
>>> isinstance(dog,Dog)
True
>>> isinstance(dog,Animal)
True
  1. isinstance(x,(Class1,Class2,...))判断x是否属于Class1,Class2…其中一个数据类型,比如:
>>> isinstance([1,2,3],(list,tuple))
True
>>> isinstance([1,2,3],(dict,tuple))
False
  1. isinstance(x,Class1) and isinstance(x,Class2)判断x是否属于Class1和Class2。例如:
>>> isinstance(dog,Dog) and isinstance(dog,Animal)
True
>>> 

注意:优先使用isinstance()判断类型,可以将指定类型和子类型都判断。

使用dir()

功能:返回一个对象的所有属性和方法,返回的是一个包含字符串的list。
定义一个类,包含学生的姓名name和成绩score

class Student(object):
    name='lm'
    def __init__(self,name,score):
        self.__name=name
        self.__score=score
    def Get_Name(self):
        return self.__name
    def Get_Score(self):
        return self.__score

执行如下:

>>> S1=Student('lama',20)
>>> dir(S1)
['Get_Name', 'Get_Score', '_Student__name', '_Student__score', '__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__', 'name']

以上结果得到的就是实例S1的所有属性和方法,类似__xxx__的属性和方法都有特殊的意义。我们可以看到两个属性_Student__name_Student__score这其实就是我们定义的私有属性__name__score我们外部无法访问私有变量,因为内部将私有属性名改变了,当我们访问这两个属性时,其实就是访问了私有变量。所以说,总是有办法访问私有属性的。

getattr(),setattr(),hasattr()函数的使用

这三个函数从名字就可以看出来,分别是获取实例中的方法或属性,添加实例的方法或属性,判断实例是否有该方法或属性。
比如:
1, hasattr()无法判断是否有私有属性

>>> hasattr(S1,'name')
True
>>> hasattr(S1,'_Student__name')
True
>>> hasattr(S1,'__name')
False
  1. setattr()设置属性,也可以添加属性
>>> setattr(S1,'name','LAMA')
>>> S1.name
'LAMA'
>>> setattr(S1,'name_1','LAMA')
>>> S1.name_1
'LAMA'
  1. getattr() 获取并返回属性,若没有该属性则返回指定值
>>> a=getattr(S1,'name')#将S1中的`name`值赋给a
>>> a
'LAMA'
>>> a=getattr(S1,'n',404)#不存在该属性,则赋值404
>>> a
404

注意:

在类中定义的属性,也可以在实例中使用,比如:

class Student(object):
    name='lm'
    def __init__(self,name,score):
        self.__name=name
        self.__score=score
    def Get_Name(self):
        return self.__name

name就是该类的属性,则每个实例中都存在该属性,比如:

>>> S1=Student('lama',20)
>>> S1.name
'lm'
>>> Student.name
'lm'

但是当实例中也定义了该属性,则实例的属性覆盖类的属性:

>>> S1.name='LAMA'
>>> S1.name
'LAMA'
>>> Student.name
'lm'

当删除该实例的name属性,则重新将该属性变为类属性:

>>> del S1.name
>>> S1.name
'lm'

所以,不要将类属性和实例属性名重复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值