Python的私有变量,函数是在前面加上一个双下划线'__'来声明的,气访问和C++大同小异
例如
1 class Person:2 __name='小甲鱼'3 def print1(self): # 和 c++ 相同 私有变量只能本类之内访问 .4 return self.__name5 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 pass6 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 pass13 14 class Carp(Fish):15 pass16 17 class Aslmon(Fish):18 pass19 20 class Shark(Fish):21 def __init__(self):22 self.hungry=True23 def eat(self):24 if self.hungry:25 print("吃货的梦想就是天天有得吃")26 self.hungry=False27 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 810 >>> fish.move()11 我的位置是: 6 812 >>> goldfish=Goldfish()13 >>> goldfish.move()14 我的位置是: 7 615 >>> goldfish.move()16 我的位置是: 6 617 >>> goldfish.move()18 我的位置是: 5 619 >>> shark=Shark()20 >>> shark.eat()21 吃货的梦想就是天天有得吃22 >>> shark.eat()23 撑死我 你偿命?24 >>> shark.eat()25 撑死我 你偿命?26 >>> shark.move27>28 >>> shark.move()29 Traceback (most recent call last):30 File " ", line 1, in 31 shark.move()32 File "C:/Users/Administrator/Desktop/new.py", line 8, in move33 self.x-=134 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=True15 def eat(self):16 if self.hungry:17 print("吃货的梦想就是天天有得吃")18 self.hungry=False19 else:20 print('撑死我 你偿命?')
1 =============== RESTART: C:/Users/Administrator/Desktop/new.py ===============2 >>> shark=Shark()3 >>> shark.eat()4 吃货的梦想就是天天有得吃5 >>> shark.move6>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=True15 def eat(self):16 if self.hungry:17 print("吃货的梦想就是天天有得吃")18 self.hungry=False19 else:20 print('撑死我 你偿命?')21 22 shark=Shark()23 shark.move()
1 =============== RESTART: C:/Users/Administrator/Desktop/new.py ===============2 我的位置是: 2 13 >>>
2 : 更加优秀的方法 就是使用supper 函数 .
import random as rclass 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 pass11 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 池塘里面有乌龟 10 个 3 4 池塘里面有鱼 1 个 5 6 >>>