1、访问限制
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。如:
class Student(object): def __init__(self, name, score): self.name = name self.score = score def print_score(self): print('%s: %s' % (self.name, self.score))
从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的name
、score
属性。如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__
,在Python中,实例的变量名如果以__
开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。如:
class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def print_score(self): print('%s: %s' % (self.__name, self.__score))
这样就无法从外部访问实例变量.__name
和实例变量.__score
了,这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。
但是如果外部代码需要获取内部变量怎么办?需要修改socre怎办?可以给Student类增加以下这样的方法:
class Student(object): ... def get_name(self): return self.__name def get_score(self): return self.__score def set_score(self, score): self.__score = score
2、获取对象信息
如果要判断一个对象的类型时,怎么办?
2.1 type()
对于基本类型都可以用type()类判断:
print(type(123)) ----------><class 'int'> print(type('string')) ----------><class 'str'>
2.2 isinstance()
对于class的继承关系来说,使用type()
就很不方便。我们要判断class的类型,可以使用isinstance()
函数。
如下一个具有继承关系的class来说:
object -> Animal -> Dog -> Husky
那么,isinstance()
就可以告诉我们,一个对象是否是某种类型。
>>> a = Animal() >>> d = Dog() >>> h = Husky()
结果:
>>> isinstance(h, Husky) True >>> isinstance(h, Dog) True >>> isinstance(h, Animal) True >>> isinstance(d, Dog) and isinstance(d, Animal) True >>> isinstance(d, Husky) False