Python _ 开始介绍对象

Python的私有变量,函数是在前面加上一个双下划线'__'来声明的,气访问和C++大同小异

例如

1 class Person:
2         __name='小甲鱼'
3         def print1(self):   # 和 c++ 相同 私有变量只能本类之内访问 .
4                 return self.__name
5 nam=Person()
6 print(nam.print1())
7 print(nam._Person__name)

 

1 class Parent:
2     def hello(self):
3         print('我是爸爸 .')
4 class Child(Parent):
5     pass
6 parent=Parent()    # 儿子说 他是爸爸
7 child=Child()   # 爸爸就生气了       虽然说你继承了我但是   这样就太过分了
8 p.hello()

如果子类定义了和 父类相同的方法或者属性 子类的会将父类的覆盖

 1 class Parent:
 2     def hello(self):
 3         print('我是爸爸 .')
 4 class Child(Parent):
 5     def hello(self):
 6         print('我是儿子')
 7 parent=Parent()    # 儿子说 他是爸爸
 8 child=Child()   # 这样还差不多 , 要有自己的发展空间么 . 
 9 parent.hello()
10 child.hello()

以前一直困惑的 __init__  不知道是啥东西 .  今天才知道  这就是 和C++差不多的 构造函数 (在建立对象的时候  会自动运行的函数 . )

 1 import random as r
 2 class Fish:
 3     def __init__(self):
 4         self.x=r.randint(0,10)
 5         self.y=r.randint(0,10)
 6 
 7     def move(self):
 8         self.x-=1
 9         print('我的位置是: ',self.x,self.y)
10 
11 class Goldfish(Fish):
12     pass
13 
14 class Carp(Fish):
15     pass
16 
17 class Aslmon(Fish):
18     pass
19 
20 class Shark(Fish):
21     def __init__(self):
22         self.hungry=True
23     def eat(self):
24         if self.hungry:
25             print("吃货的梦想就是天天有得吃")
26             self.hungry=False
27         else:
28             print('撑死我 你偿命?')

下面进行测试 . 

 1 Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (Intel)] on win32
 2 Type "copyright", "credits" or "license()" for more information.
 3 >>> 
 4 =============== RESTART: C:/Users/Administrator/Desktop/new.py ===============
 5 >>> fish=Fish()
 6 >>> fish.move()
 7 我的位置是:  8 8
 8 >>> fish.move()
 9 我的位置是:  7 8
10 >>> fish.move()
11 我的位置是:  6 8
12 >>> goldfish=Goldfish()
13 >>> goldfish.move()
14 我的位置是:  7 6
15 >>> goldfish.move()
16 我的位置是:  6 6
17 >>> goldfish.move()
18 我的位置是:  5 6
19 >>> shark=Shark()
20 >>> shark.eat()
21 吃货的梦想就是天天有得吃
22 >>> shark.eat()
23 撑死我 你偿命?
24 >>> shark.eat()
25 撑死我 你偿命?
26 >>> shark.move
27 <bound method Fish.move of <__main__.Shark object at 0x031C9FF0>>
28 >>> shark.move()
29 Traceback (most recent call last):
30   File "<pyshell#13>", line 1, in <module>
31     shark.move()
32   File "C:/Users/Administrator/Desktop/new.py", line 8, in move
33     self.x-=1
34 AttributeError: 'Shark' object has no attribute 'x'
35 >>> 

可以看到在最后调用 shark 的 move的时候 发生了错误 . 报错说 没有 X 这个东西 . 

咋回事呢 .  Shark 在继承Fish 类的时候 重写了 __init__  导致没有 x 和 y 这两个变量 . 

那我们应该怎么避开这个坑呢 . ?  我们应该 在子类重写 __init__ 的时候现调用父类的 __init__ 使其同时存在  . 

实现这种思想 一共有两种方法 .  1 : 调用未绑定的父类方法 .  2 : 使用supper 函数  .

 1:

 1 import random as r
 2 class Fish:
 3     def __init__(self):
 4         self.x=r.randint(0,10)
 5         self.y=r.randint(0,10)
 6 
 7     def move(self):
 8         self.x-=1
 9         print('我的位置是: ',self.x,self.y)
10 
11 class Shark(Fish):
12     def __init__(self):
13         Fish.__init__(self)     # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
14         self.hungry=True
15     def eat(self):
16         if self.hungry:
17             print("吃货的梦想就是天天有得吃")
18             self.hungry=False
19         else:
20             print('撑死我 你偿命?')
1 =============== RESTART: C:/Users/Administrator/Desktop/new.py ===============
2 >>> shark=Shark()
3 >>> shark.eat()
4 吃货的梦想就是天天有得吃
5 >>> shark.move
6 <bound method Fish.move of <__main__.Shark object at 0x02E7DA10>>
7 >>> shark.move()
8 我的位置是:  9 4

 1 import random as r
 2 class Fish:
 3     def __init__(self):
 4         self.x=r.randint(0,10)
 5         self.y=r.randint(0,10)
 6 
 7     def move(self):
 8         self.x-=1
 9         print('我的位置是: ',self.x,self.y)
10 
11 class Shark(Fish):
12     def __init__(self):
13         Fish.__init__(self)
14         self.hungry=True
15     def eat(self):
16         if self.hungry:
17             print("吃货的梦想就是天天有得吃")
18             self.hungry=False
19         else:
20             print('撑死我 你偿命?')
21 
22 shark=Shark()
23 shark.move()

 

 

1 =============== RESTART: C:/Users/Administrator/Desktop/new.py ===============
2 我的位置是:  2 1
3 >>> 

 

 

2 : 更加优秀的方法  就是使用supper 函数 . 

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 Shark(Fish):
    def __init__(self):
        super().__init__()
        self.hungry=True

    def eat(self):
        if self.hungry:
            print("吃货的梦想就是天天有得吃")
            self.hungry=False
        else:
            print('撑死我 你偿命?')
shark=Shark()
shark.move()
shark.eat()

使用super的话就不需要填写 父类的名字 , 它可以帮你自动寻找 . 

最后说一下多重继承把  .  多重继承 也就只是在 括号内多写几个 类名罢了 . 

 1 class Base1:
 2     def foo1(self):
 3         print('我是foo1,我为Base1代言....')
 4 
 5 class Base2:
 6     def foo2(self):
 7         print('我是foo2,我为foo2代言.....')
 8 
 9 class C(Base1,Base2):
10     pass
11 
12 c=C()
13 c.foo1()
14 c.foo2()
1 =============== RESTART: C:/Users/Administrator/Desktop/new.py ===============
2 我是foo1,我为Base1代言....
3 我是foo2,我为foo2代言.....
4 >>> 

 汇合类

 1 class Turtle:
 2     def __init__(self,x):   # 在生命对象的时候 说明对象的 数量 . (还是一个对象 . 数量只是该对象的一个属性 . )
 3         self.num=x
 4 
 5 class Fish:
 6     def __init__(self,x):
 7         self.num=x
 8 
 9 class Pool:
10     def __init__(self,x,y):
11         self.turtle=Turtle(x)   #在该对象中定义 乌龟属性 , 该属性 为乌龟对象的实例化
12         self.fish=Fish(y)
13     def print_num(self):
14         print('池塘里面有乌龟 %d 个'% self.turtle.num,'\n')
15         print('池塘里面有鱼 %d 个'%self.fish.num,'\n')
16 pool=Pool(1,10)
17 pool.print_num()
1 =============== RESTART: C:\Users\Administrator\Desktop\new.py ===============
2 池塘里面有乌龟 103 
4 池塘里面有鱼 15 
6 >>> 

 

posted @ 2016-07-14 21:18  X-POWER  阅读(453)  评论(0编辑  收藏  举报