1. issubclass()函数
issubclass()是一个布尔函数,这个函数用来判断一个类是否是另外一个类的子类或者子孙类。如果给出的子类确实是给出的父类的子类,则返回True,否则返回False。
它的语法如下:
issubclass(subclass, parentclass)
- parentclass也可以是一个包含若干个父类的元组,只要子类属于元组中某一个父类,则返回True,否则返回False。
2. isinstance()函数
isinstance()是一个布尔函数,这个函数用来判断一个对象是否是给定类的实例。若是给定类的实例或是给定类的子类的实例,则返回True,否则返回False。
它的语法如下:
isinstance(object,class)
hasattr()、getattr()、setattr()、delattr()这几个函数可以在各种对象下工作,不限于类和实例。
(1)hasattr()
hasattr()是布尔型的,它用于判断一个对象是否有一个特定的属性,一般用于在调用某个属性前检查属性是否存在。
例如:
class testClass(object):
foo = 100
def __init__(self,name):
self.name = name
test = testClass('theName')
print(hasattr(test,'name'))
print(hasattr(testClass,'foo'))
结果为:
True
True
(2)getattr()、setattr()
getattr()是用来获取对象的属性或者方法。若返回的是对象,则返回对象的值,若返回的是对象的方法,则返回方法的内存地址。**setattr()**是用来给对象的属性赋值。若属性不存在,就先创建属性然后再赋值。
例如:
class testClass(object):
foo = 100
def __init__(self,name):
self.name = name
test = testClass('theName')
setattr(test,'fool','200')
setattr(test,'foo','50')
print(getattr(test,'fool'))
print(getattr(test,'foo'))
结果为:
200
50
(3) delattr()
delattr()是用来从一个对象中删除属性。
dir()作用:
- 作用在实例上时,显示实例变量、实例所在的类、基类中定义的方法和属性;
- 作用在类上时,显示类与它的基类的__dict__内容;
- 作用在模块上时,显示此模块的__dict__内容;
- dir()不带参数时,显示调用者的局部变量。
例如:
class testClass(object):
foo = 100
def __init__(self,name):
self.name = name
test = testClass('theName')
print(dir(test))
结果为:
['__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__', 'foo', 'fool', 'name']
3. super()函数
super()函数的作用就是找出相应的类的父类,然后调用父类的方法与属性。
例如:
class parentClass:
def __init__(self):
self.name = "parent"
def tell(self):
print("this is parentClass")
class subClass(parentClass):
def tell(self):
print("this is subClass")
parentClass.tell(self)
sc = subClass()
sc.tell()
结果为:
this is subClass
this is parentClass
在这个示例中,我们在调用父类的方法时是通过非绑定的方式调用,这样的调用方式增大了代码的耦合性。如果我们要修改subClass的父类,则在子类的调用中也要修改相应代码。如果代码量庞大的话,这个工作几乎很难完成,所以我们采用super方法。
例如:
class parentClass:
def __init__(self):
self.name = "parent"
def tell(self):
print("this is parentClass")
class subClass(parentClass):
def tell(self):
print("this is subClass")
super(subClass,self).tell()
sc = subClass()
sc.tell()
结果为:
this is subClass
this is parentClass
上面的例子中,我们将寻找父类的任务交给子类,这样既可保证代码的安全,修改起来也很方便。
3. vars()函数
vars()是用来返回对象的属性及其值的一个字典。如果没有给出对象,则返回当前调用位置的属性和属性值。
4. 类的私有化
(1)双下划线
在 Python 中,可以在属性或方法前添加双下划线将其变为私有。在这种方法下,要调用私有属性就在名字前加上单下划线和类名。利用这种调用方法,就可以很好地避免当子类变量名与父类变量名相同时覆盖父类的变量。
例如:
class privatization(object):
def __init__(self,var):
self._var = var
self.__var = var
self.__var__ = var
self.varation = var
pr = privatization(2)
print(pr._var)
print(pr.__var__)
print(pr.varation)
print(pr._privatization__var)
结果为:
2
2
2
2
(2)单下划线
在一个模块中以单下划线开头的变量和函数被默认当做内部函数。当我们使用from module import *来导入模块时,这些不会被导入。但如果使用import module来导入整个模块,这部分还是会被导入,那么就可以用module.var来访问。
- 在 Python中,以双下划线开头和双下划线结尾的是一些特殊的方法。比如__init__()、del()等,建议不要以这样的方式来定义自己的变量或函数。