Python3 面向对象编程
类
class Student(object):
pass
class
关键字后是类名,类名通常以大写字母开头- 之后是
(object)
,表示该类从哪个类继承下来。如果没有合适的继承类,就使用object
类,这是所有类最终都会继承的类 __init__
方法,在创建实例的时候可以把必须绑定的属性填写进去。
class Student(object)
def __init__(self,name,score):
self.name=name
self.score=score
__init__
方法后的第一个参数永远是self
,表示创建的实例本身。在__init__
内部,可以把各种属性绑定到self
,因为self
指向创建的实例本身。
数据封装
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))
- 定义一个方法,除了第一个参数是
self
之外,其他与普通函数一样。 - 调用一个方法,只需要在实例变量上直接调用,除了
self
不用传递,其他参数需要正常传递
访问限制
- 如果要让内部属性不被外部访问,可以加
__
变成私有变量,只有内部可以访问,外部不能访问。
class Student(object):
def __init__(self,name,score):
self.__name=name
self.__score=score
def print_score(score):
print('%s:%s' %(self.__name,self.__score))
获取对象信息
- 使用
type()
判断对象类型 - 使用
types
模块中定义的常量判断是否是函数
import types
def fn():
pass
type(fn)==types.FunctionType
- 判断class的类型,使用
isinstance()
函数 - 获得一个对象所有的属性和方法,使用
dir()
,返回一个包含字符串的list。
*类似__xxx__
的属性和方法在Python中有特殊用途。如__len__
方法返回长度。调用len()
函数获取一个对象的长度,实际在len()
内部会自动调用该对象的__len__()
方法。以下等价
>>>len('ABC')
3
>>>'ABC'.__len__()
3
getattr()
、setattr()
、hasattr()
,可以操作一个对象的状态。
clas MyObject(object):
def __init__(self):
self.x=9
def power(self):
return self.x * self.x
obj=MyObject()
>>>hasattr(obj,'x')
True
>>>obj.x
9
>>>hasattr(obj,'y')
Flase
>>>setattr(obj,'y',19)
>>>hasattr(obj,'y')
True
>>>getattr(obj,'y')
19
>>>obj.y
19
实例属性和类属性
- Python是动态语言,根据类创建的实例可以任意绑定属性
给实例绑定属性的方法:通过实例变量,或self
变量
class Student(object):
def __init__(self,name):
s=Student('Bob')
s.score=90
- 若类本身需要绑定一个属性,可以直接在类中定义属性,即类属性。
类属性虽然归类所有,但类的所有实例都可以访问。
class Student(object):
name='Student'
- 不要把实例属性和类属性使用相同的名字,相同名称的实例属性将屏蔽掉类属性。