类的继承笔记

特征:封装,继承,多态

对象的方法 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 "", line 1, in

    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': , 'printXY': , '__dict__': , '__weakref__': , '__doc__': None})

>>> dd.setXY(4,5)

>>> dd.__dict__

{'x': 4, 'y': 5}

>>> CC.__dict__

mappingproxy({'__module__': '__main__', 'setXY': , 'printXY': , '__dict__': , '__weakref__': , '__doc__': None})

(实例化相当于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 "", line 1, in

    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 "", line 1, in

    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 "", line 1, in

    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 "", line 1, in

    c1.size

AttributeError: 'C' object has no attribute 'size'

你可能感兴趣的:(类的继承笔记)