一个.py文件就称之为一个模块
使用模块 import sys
_name_特殊变量
面向对象编程
(Object Oriented Programming,OOP)
关于面向对象编程的一个有趣的解释:
上帝
class 类 (人)
instance 实例 (你,我,他)
你会有些属性(身高,年龄,体重)
你会有些技能(吃饭,泡妞)
init 方法的主要作用,就是初始化你的属性,这些属性,在上帝初始化你的时候就要赋予给你,比如zhangsan = Person(170,29,50)这时上帝就把你创造出来了,也就是实例化了你,然后,你到底有哪些技能呢,这就看有没有在类里面定义了,如果有定义泡妞的技能,那么你就可以调用泡妞的技能来泡妞,大致就是这样吧,看看下面的例子就更清楚了
class Person(object):
# 这里就是初始化你将要创建的实例的属性
def __init__(self,hight,weight,age):
self.hight = hight
self.weight = weight
self.age = age
# 定义你将要创建的实例所有用的技能
def paoniu(self):
print('你拥有泡妞的技能')
def eat(self):
print('you can eat')
# 开始创建实例
zhangsan=Person(170,50,29)
lisi = Person(175,100,30)
# 你的实例开始使用它的技能
zhangsan.paoniu()
lisi.eat()
定义类:class后是类名,类名通常是大写,紧接着是(object),表示类从那个类继承过来的,如果没有合适的继承类,就用object类。
class Building(object):
def __init__(self,name,high,city)
self.name=name
self.high=high
self.city=city
aa=Building('fishjump',1987,'shenzhen')
aa.name
由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__方法,在创建实例的时候,就把name,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))
访问限制
如果不想内部属性被外部访问,在属性前面加两个__,变成一个私有量,只有内部可以访问
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))
bart=Student('xiaoming',98)
bart.name #不能调用
外部代码想要获取变量,给类增加方法
class Student(object):
...
def get_name(self):
return self.__name
def get_score(self):
return self.__score
外部代码修改变量
class Student(object):
...
def set_score(self, score):
if 0 <= score <= 100:
self.__score = score
else:
raise ValueError('bad score')
继承和多态
子类获得父类的全部功能
class Animal(object):
def run(self):
print('Animal is running...')
class Dog(Animal):
pass
class Cat(Animal):
pass
dog = Dog() #变量dog指向Dog的实例
dog.run()
cat = Cat()
cat.run()
当子类和父类存在相同的函数方法时(run()),子类的方法会覆盖父类的方法
多态,鸭子类型
获取对象信息
判断对象类型用type()函数
type(132)=int
判断class类型使用isinstance()函数,isinstance判断一个对象是否是该类型本身或者位于该类型的父继承链上。
a = Animal()
isinstance(a, Husky)
False
如果想获取对象的所有属性和方法,使用dir()函数,返回一个包含字符串的list
dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']
__xxx__有特殊用途
操作对象状态用getattr(),setattr(),hasattr()
class MyObject(object):
def __init__(self):
self.x = 9
def power(self):
return self.x * self.x
obj = MyObject()
hasattr(obj,'x') #有属性x吗?
True
setattr(obj,'y',19) #设置一个属性y
getattr(,obj,'y') #获取属性y
19
getattr(obj,'z',404) #获取属性z,若不存在返回默认值404
实例属性和类属性
>>> class Student(object):
... name = 'Student' #定义类属性后所有的实例都可以访问
...
>>> s = Student() # 创建实例s
>>> print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
Student
>>> print(Student.name) # 打印类的name属性
Student
>>> s.name = 'Michael' # 给实例绑定name属性
>>> print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性
Michael
>>> print(Student.name) # 但是类属性并未消失,用Student.name仍然可以访问
Student
>>> del s.name # 如果删除实例的name属性
>>> print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了
Student