特征:封装,继承,多态
对象的方法 self 参数 (相当于c++中的this指针)
>>> class Ball:
def setName(self,name):
self.name = name
def kick(self):
print("我叫%s" % self.name)
>>> a = Ball()
>>> a.setName('球A')
>>> b = Ball()
>>> b.setName('球B')
>>> c = Ball()
>>> c.setName('土豆')
>>> a.kick()
我叫球A
>>> b.kick()
我叫球B
>>> c.kick()
我叫土豆
------------------------------------------------------------
公有和私有 在对象中加入 __ 会变成私有,私有对象不能被直接调用出来
>>> class Person:
__name = "stlaker"
>>> p=Person()
>>> p.__name #直接调用会调用失败
Traceback (most recent call last):
File "
p.__name
AttributeError: 'Person' object has no attribute '__name'
>>> class Person:
__name = "stlaker"
def getName(self):
return self.__name
>>> p=Person()
>>> p.getName()
'stlaker'
>>> p._Person__name
'stlaker'
------------------------------------------------------------
继承:
子类 基类,父类或超类
class DerivedClassName(BaseClassName):
...
>>> class Child(parent):
pass
>>> p = parent()
>>> p.hello()
正在调用父类方法
>>> c = Child()
>>> c.hello()
正在调用父类方法
#如果子类中定义与父类同名的方法或属性,则会自动覆盖
#父类对应的方法或属性
>>> class Child(parent):
def hello(self):
print("正在调用子类的方法")
>>> c=Child()
>>> c.hello()
正在调用子类的方法
#在继承父类的方法后,如果对__init__进行了重载 如果需要使用父类的__init__可以使用:
#-调用未绑定的父类方法
#-调用super函数
具体查看 类的继承.py
继承可以多重继承:
class DerivedClassName(Base1,Base2,Base3,):
#多重继承
class Base1:
def foo1(self):
print("1")
class Base2:
def foo2(self):
print("2")
class C(Base1,Base2):
pass
>>>c=C()
>>>c.foo1()
1
>>>c.foo2()
2
------------------------------------------------------------
#组合
class Turtle:
def __init__(self,x):
self.num = x
class Fish:
def __init__(self,x):
self.num = 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))
#>>> pool = Pool(1,10)
#>>> pool.print_num()
#池里总共有乌龟 1 只,鱼 10 条
-不要试图在一个类里面定义出所有能想到的特性和方法,应该利用继承和
组合机制来进行扩展
-用不同的词性命名,如属性名用名词,方法名用动词
-python严格要求方法需要有实例才能被调用,这种限制其实就是python所谓的绑定概念
>>> class CC:
def setXY(self,x,y):
self.x = x
self.y = y
>>> class CC:
def setXY(self,x,y):
self.x = x
self.y = y
def printXY(self):
print(self.x,self.y)
>>> dd = CC()
>>> dd.__dict__
{}
>>> CC.__dict__
mappingproxy({'__module__': '__main__', 'setXY':
>>> dd.setXY(4,5)
>>> dd.__dict__
{'x': 4, 'y': 5}
>>> CC.__dict__
mappingproxy({'__module__': '__main__', 'setXY':
(实例化相当于dd.setXY(dd,4,5))
-类中定义的属性是静态对象,即时类被删除,实例化的对象也能使用
------------------------------------------------------
相关的BIF(内置函数) (object:指对象)
1.一个类被认为是其自身的子类
issubclass(class,classinfo)
返回 True 或 False
2.检查一个实例对象是否属于一个类
- 如果第一个参数不是一个对象,则永远返回false
- 如果第二个参数不是类或者由类对象组成的元祖,会抛出一个TypeError异常
isinstance(object,classinfo)
返回 True 或 False
3.访问对象的属性
- attr = attribute:属性
hasattr(object,name)
返回对象指定的属性值
getattr(object,name[,default])
设置对象中指定的值,如果不存在,则直接创建并赋值
setattr(object,name,value)
删除对象中指定的属性,如果对象不存在,则抛出异常
delattr(object,name)
>>> class A:
pass
>>> class B(A):
pass
>>> issbuclass(B,A)
Traceback (most recent call last):
File "
issbuclass(B,A)
NameError: name 'issbuclass' is not defined
>>> issubclass(B,A)
True
>>> issubclass(B,B)
True
>>> issubclass(B,object)
True
>>> class C:
pass
>>> issubclass(B,C)
False
>>> b1 = B()
>>> isinstance(b1,B)
True
>>> isinstance(b1,A)
True
>>> isinstance(b1,C)
False
>>> class C:
def __init__(self,x=0)
SyntaxError: invalid syntax
>>> class C:
def __init__(self,x=0):
self.x = x
>>> c1 = C()
>>> hasattr(c1,'x')
True
>>> getattr(c1,'x')
0
>>> getattr(c1,'y')
Traceback (most recent call last):
File "
getattr(c1,'y')
AttributeError: 'C' object has no attribute 'y'
>>> getattr(c1,'y','您所访问的内容不存在')
'您所访问的内容不存在'
>>> setattr(c1,'y',20)
>>> getattr(c1,'y')
20
>>> delattr(c1,'y')
>>> delattr(c1,'y')
Traceback (most recent call last):
File "
delattr(c1,'y')
AttributeError: y
通过属性来设置属性
获得属性的方法 设置属性的方法 删除属性的方法
property(fget = None , fset=None, fdel = None,dec=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()
>>> c1.getSize()
10
>>> c1.x
10
>>> c1.x = 18
>>> c1.x
18
>>> c1.size
18
>>> c1.getSize()
18
>>> del c1.x
>>> c1.size
Traceback (most recent call last):
File "
c1.size
AttributeError: 'C' object has no attribute 'size'