面向对象
1)self
类中的函数第一个参数必须是self, self 是为了指代它所存在的类Class之中。
比如我们如果有好几个不同的obj被创建成同一个类,
那么有了self,我们的class Foo就能很好的知道哪个指的是自己,不会乱
所以说,这个 self 就是个代指。代指了自己所在的class。你可以由 self 点进所指class本身的函数。由此可见,self 本身作为一个代词,并不一定要叫self。你也可以用个其他什么来代替。只不过,必须得是这个类的所有子方法的第一个参数:
2)访问控制
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
class Student:
def __init__(self, name, age):
self.__name = name
self.__age = age
def detail(self):
print(self.__name)
print(self.__age)
LiLei = Student('LiLei', 12)
LiLei.__age = 20
LiLei.detail()
>>
LiLei
12
3)一些方法
dir():
如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法
getattr()、setattr()以及hasattr():
我们可以直接操作一个对象的状态:
hasattr(obj, 'x') #有木有属性'x'
setattr(obj, 'y', 19) # 设置一个属性'y'
getattr(obj, 'y') # 获取属性'y'
getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404
4)实例属性和类属性
实例属性:
class Student(object):
def __init__(self, name):
self.name = name
s = Student('Bob')
s.score = 90
类属性:
class Student(object):
name = 'Student'
s = Student() # 创建实例s
print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
s.name = 'Michael' # 给实例绑定name属性
print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性
总结:
1、实例属性可以通过动态添加,而类属性是在创建类的时候已经添加好了
2、从上面的例子可以看出,在编写程序的时候,千万不要把实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。