对象 = 属性 + 方法
一个关于类的简单例子:
class Turtle: #python中的类名约定以大写字母开头
#属性
color = 'green'
weight = 10
legs = 4
shell = True
amouth = '大嘴'
#方法:
def climb(self):
print("我正努力的向前爬....")
def run(self):
print("我正飞快的向前跑....")
def bite(self):
print("咬死你咬死你!!")
def eat(self):
print("有吃的,好开心")
def sleep(self):
print("睡觉吧,Zzzz")
运行后调用结果如下:
======================= RESTART: D:/Python35/c/lei.py =======================
>>> tt = Turtle()
>>> tt.climb()
我正努力的向前爬....
>>> tt.run()
我正飞快的向前跑....
>>> tt.bite()
咬死你咬死你!!
>>>
面向对象的三个特征:
1)封装:就是属性和方法放在一起,也是一种信息隐蔽技术,因为调用的时候只是告诉方法的名字,不关系方法里面具体是如何实现的。
比如下面的sort()方法只是知道它有排序的作用,就调用它实现排序,但是里面具体怎么实现的我们并不清楚:
>>> list = [1,5,3,6,8]
>>> list.sort()
>>> list
[1, 3, 5, 6, 8]
>>>
2)继承:即子类自动共享父类之间的数据和方法
>>>
>>> class Parent:
def hello(self):
print("正在调用父类的方法")
>>> class Child(Parent):
pass
>>> p = Parent()
>>> p.hello()
正在调用父类的方法
>>> c = Child()
>>> c.hello()
正在调用父类的方法
3)多态:即不同对象对同一方法返回值不通
例子,
>>>
>>> class A:
def fun(self):
print("我是小A")
>>> class B:
def fun(self):
print("我是小B")
>>> a = A()
>>> a.fun()
我是小A
>>> b = B()
>>> b.fun()
我是小B
类 是图纸, 根据 类实例化后的对象才是房子,就像上面的例子,A是类(图纸),a是实例化后的对象(房子)
self 是什么
解释:和c里面的 this差不多,代表调用自身。
例子:
>>> class Ball:
def setName(self,name):
self.name = name
def tick(self):
print("我是%s,该死的谁踢我" % self.name)
>>> a = Ball()
>>> a.setName('篮球')
>>>
>>> c = Ball()
>>> c.setName('土豆')
>>> a.tick()
我是篮球,该死的谁踢我
>>> c.tick()
我是土豆,该死的谁踢我
>>>
上面之所以A是篮球,C是土豆,就是因为 self去寻找各自的参数的。
我们只要记住 类 定义的时候把 self 写入第一个参数就好了。
特殊参数
__init__ #注意这里是2个下划线哦,作用是在定义参数的时候传入参数,也java里面的构造函数差不多
>>>
>>> class Ball:
def __init__(self,name):
self.name = name
def tick(self):
print("我是%s,该死的谁踢我" % self.name)
>>> b = Ball('哈哈')
>>>
>>> b.tick()
我是哈哈,该死的谁踢我
>>>
公有 和 私有
>>> class Person:
name == 'gaoyx'
>>> a = Person()
>>> a.name
'gaoyx'
#以上是公有的,可以调用。
>>> #Python中如果定义私有变量只需要在变量名或者函数名前面加上“__”两个下划线,函数或者变量就会变为私有的了
>>>
>>> class Person:
__name = 'gaoyx'
>>> a =Person()
>>> a.name
Traceback (most recent call last):
File "<pyshell#181>", line 1, in <module>
a.name
AttributeError: 'Person' object has no attribute 'name'
>>> a.__name
Traceback (most recent call last):
File "<pyshell#182>", line 1, in <module>
a.__name
AttributeError: 'Person' object has no attribute '__name'
#如果想得到里面的私有变量值,可以这么做
>>> class Person:
__name = 'gaoyx'
def getName(self):
return self.__name
>>> p =Person()
>>> p.getName()
'gaoyx'
>>>
>>> #其实还可以这么访问
>>> p._Person__name
'gaoyx'
>>> 因为Python把双下划线开头的变量改了名字,改为了 _类名__变量名
继承
在前面讲面向对象3个特征时候已经介绍过了,这里说一下,如果子类继了父类但是里面的某个方法被重新定义后,导致无法使用父类的方法,可以用这个解决:
在子类被重新定义的方法里面写上:
super().__init__()
#__init__是父类的防范
子类也可以继承多个父类,直接在()里面写多个父类的名字即可。
组合
当实体不像子类父类那样可以继承时,要是想放在一起可以使用组合,比如:定义一个类 叫水池,水池里面有乌龟和鱼。
例如:
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 条!
>>>
总结:所谓的组合就是把类的实例化放到一个新类里面,就会把旧类组合进去。
网友评论