对象 = 属性 + 方法
静态特征称之为属性
动作称之为方法
面向对象编程的特征:
1.封装(封装属性和方法,成为独立性很强的模块,同时也是一种信息隐蔽技术,使得数据更加安全)
2.继承(子类会继承父类的数据和方法)
3.多态(不同对象对同一方法像有不同的行动)
self:像是房子的门牌号,在Python中由同一个类会生成很多对象,当一个对象方法被调用的时候,对象会将自身作为第一个参数传给self,用来区分不同的对象
Python魔法方法:
__init__(self)
构造方法,只要实例化一个对象的时候,这个方法就会自动调用
class Ball:
def __init__(self,name):
self.name = name
def kick(self):
print('我叫%s' % self.name)
b = Ball('土豆')
b.kick()
在Python中默认方法和属性都是公有的
class Person:
name = '大牛逼'
p = Person()
print(p.name)
在Python中,如果想要定义私有变量,只需要在变量或函数名前加两个“_”
class Person:
__name = '大牛逼'
def getname(self):
return self.__name
p = Person()
# 从外部无法直接访问
print(p.name)
# 只能从内部进行访问
print(p.getname())
继承
子类可以继承父类的任何属性和方法
class Parent():
def hello(self):
print('正在调用父类方法...')
class Child(Parent):
pass
p = Parent()
p.hello()
h = Child()
h.hello()
如果子类中定义了父类的同名方法或这属性,会自动覆盖父类的方法(属性)
class Parent():
def hello(self):
print('正在调用父类方法...')
class Child(Parent):
def hello(self):
print('正在调用子类的方法...')
h = Child()
h.hello()
案例:
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 Goldfish(Fish):
pass
class Carp(Fish):
pass
class shark(Fish):
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print('吃小鱼')
self.hungry = False
else:
print('吃饱了')
在如上场景中,调用shark类中的move方法会出现异常,原因是在shark类中重写了父类的方法
解决办法:
1.调用未绑定的父类方法
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 Goldfish(Fish):
pass
class Carp(Fish):
pass
class shark(Fish):
def __init__(self):
Fish.__init__(self)
self.hungry = True
def eat(self):
if self.hungry:
print('吃小鱼')
self.hungry = False
else:
print('吃饱了')
2.使用super函数(推荐)
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 Goldfish(Fish):
pass
class Carp(Fish):
pass
class shark(Fish):
def __init__(self):
# Fish.__init__(self)
super().__init__()
self.hungry = True
def eat(self):
if self.hungry:
print('吃小鱼')
self.hungry = False
else:
print('吃饱了')
将没有继承关系的类放到一起叫做组合
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(5, 5)
pool.print_num()
绑定
在Python中严格要求方法需要有实例才能被调用,这种限制就是Python所谓的绑定