一、概念
1. 对象
对象=属性+方法。通常将对象划分为两部分:静态部分和动态部分。静态部分被称为“属性”,这些属性不仅是不能被忽视的而且是不能被忽视的,如人的性别;动态部分指的是对象的行为,如人可以行走。
2. 类
类是封装对象的属性和行为的载体。在python语言中,类是一种抽象概念,如定义一个大雁类,在该类中,可以定义每个对象共有的属性和方法;而一只要从北方飞往南方的大雁则是大雁类的一个对象,对象是类的实例。
3. 面向对象程序设计的特点
- 封装
将对象的属性和行为封装起来,而将对象属性和行为封装起来的载体就是类,类通常对客户隐藏其实现细节。例如,用户使用计算机,只需要使用手指敲击键盘就可以实现一些功能,而无需知道计算机内部是如何工作的。 - 继承
继承是实现重复利用的重要手段,子类通过继承复用了父类的属性和行为的同时,又添加了子类特有的属性和行为。如四边形(父类)和平行四边形(子类)。 - 多态
不同对象对于同一方法响应不同行动。一个父类衍生出不同的子类,子类继承父类特征的同时,也具备了自己的特征,并且能够实现不同的效果,这就是多态化结构。
二、面向对象编程
- self
>>>class Ball:#类
def setName(self,name):#方法1
self.name=name
def kick(self):#方法2
print("我叫%s"% self.name)
>>> a=Ball()
>>> a.setName("球A")
>>> b=Ball()
>>> b.setName("球B")
>>> c=Ball()
>>> c.setName("球C")
>>> a.kick()
我叫球A
>>> b.kick()
我叫球B
- _init_(self)方法
>>> class Ball:
def __init__(self,name):
self.name=name
def kick(self):
print("我叫%s"%self.name)
>>> b=Ball("球B") #用__init__()方法此处要加参数
>>> b.kick()
我叫球B
class Geese:
'''大雁类'''
def __init__(self,beak,wing,claw):
print("我是大雁类!我有以下特征:")
print(beak)
print(wing)
print(claw)
beak_1="喙的基部较高,长度和头部的长度几乎相等"
wing_1="翅膀长而尖"
claw_1="爪子是蹼状的"
wildGoose=Geese(beak_1,wing_1,claw_1)
注:
- __init__()为双下划线;
- __init__()方法必须包含一个self参数,还可以自定义一些参数,参数间用逗号进行分隔。
- 公有私有
在python中定义私有变量只需在变量名或函数名前加上“__”两个下划线,那么这个函数或变量就会变成私有的了。
>>> class Person:
name="NCEPU"
>>> p=Person()
>>> p.name
'NCEPU'
>>> class Person:
__name="NCEPU"
def getName(self):
return self.__name
>>> p=Person()
>>> p.getName()
三、继承
一般格式:
class DerivedClassName(BaseClassName):
...
#class 类名(父类名):
实例:
class Parent:
def hello(self):
print("正在调用父类的方法...")
class Child(Parent):
pass
p=Parent()
c=Child()
p.hello()
c.hello()
#输出:
正在调用父类的方法...
正在调用父类的方法...
如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性:
class Parent:
def hello(self):
print("正在调用父类的方法...")
class Child(Parent):
def hello(self):
print("正在调用子类的方法...")
p=Parent()
c=Child()
p.hello()
c.hello()
#输出:
正在调用父类的方法...
正在调用子类的方法...
解决方法:
- 调用未绑定的父类方法;
- 使用super()函数。
import random as r
class Fish:
def __init__(self):
self.x=r.randint(0,10)
self.y=r.randint(0,10)
def move(self):
self.x-=1
print("我的位置是:",self.x,self.y)
class Goldfish(Fish):
pass
class Shark(Fish):
def __init__(self):
#方法一:调用未绑定的父类方法
#Fish.__init__(self)
#方法二:使用super()函数
super().__init__()
self.hungry = True
def eat(self):
if self.hungry:
print("吃")
self.hungry=False
else:
print("太撑了吃不下")
多重继承
class DerivedClassName(Base1,Base2...)
...
组合
class Turtle:
def __init__(self,x):
self.name=x
class Fish:
def __init__(self,x):
self.name=x
class Pool:
def __init__(self,x,y):
self.turtle=Turtle(x)
self.fish=Fish(y)
def print_num(self):
print("水池里总共有乌龟%d只,小鱼%d条"%(self.turtle.num,self.fish.num))
相关的BIF
- issubclass(class,classinfo): 检查类是否是另一类的子类 ,若class是classinfo的子类,返回True。
注:
- 一个类被认为是其自身的子类;
- classinfo可以是类对象组成的元组,只要class与其中任何一个候选类的子类,则返回True。
- isinstance(object,classinfo):检查某实例对象是否属于某类。
注:
- 如果第一个参数不是对象,则永远返回False。
- 如果第二个参数不是类或者由类对象组成的元组,会抛出一个TypeError的异常。
class A:
pass
class B(A):
pass
class C:
pass
b1=B()
print(issubclass(B,A))
print(issubclass(B,B))
print(isinstance(b1,B))
print(isinstance(b1,(A,B,C)))#均为True
- hasattr(object,name):测试一个对象是否有指定的属性
class C:
def __init__(self,x=0):
self.x=x
c1=C()
print(hasattr(c1,'x'))#要用字符串的形式
- getattr(object,name[,default]):返回参数的属性值
如没找到对应的属性值,则会返回default,default内容可以设置。 - setattr(object,name,value):设置对象中指定属性的值,若指定属性不存在,会新建一个。
- delattr(object,name):删除对象中指定的属性,若属性不存在就会抛出AttributeError异常。
- property(fget=None,fset=None,fdel=None,doc=None):通过属性设置属性。
class C:
def __init__(self,size=10):
self.size=size
def getSize(self):
return self.size
def setSize(self,value):
self.size=value
def delSize(self):
del self.size
x=property(getSize,setSize,delSize)
c1=C()
print(c1.getSize())
print(c1.x)
c1.x=18
print(c1.x)