博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python _ 开始介绍对象
阅读量:4350 次
发布时间:2019-06-07

本文共 5426 字,大约阅读时间需要 18 分钟。

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 >>>

 

转载于:https://www.cnblogs.com/A-FM/p/5671795.html

你可能感兴趣的文章
第十三周(动物这样叫)
查看>>
在Redhat Linux中执行非Redhat的Openstack, Redhat将对其Linux不提供支持
查看>>
LibreOJ #113. 最大异或和
查看>>
修改日历控件的默认样式
查看>>
Linux上部署Tomcat+Nginx负载均衡
查看>>
微信运动没有步数解决办法
查看>>
xBIM 基础14 使用LINQ实现最佳性能(优化查询)
查看>>
在windows phone 中使用原生代码开发程序(native code)
查看>>
C和指针 学习笔记-4.函数
查看>>
【次小生成树】bzoj1977 [BeiJing2010组队]次小生成树 Tree
查看>>
Java连接MySQL中文乱码处理
查看>>
linux下挂载CDROM命令
查看>>
lambda表达式匿名函数
查看>>
设计自用的golang日志模块
查看>>
vi如何设置自动缩进?
查看>>
linux下编译时遇到fatal error: openssl/sha.h: No such file or directory怎么办?
查看>>
细说 Request[]与Request.Params[]
查看>>
hibernate实现有两种配置,xml配置与注释配置。<转>
查看>>
GridControl控件
查看>>
如何在用户控件中自定义属性
查看>>