p36:给大家介绍对象
- 封装:
class Turtle:
#属性
color = 'green'
weight = 10
legs = 4
shell = True
mouth = '大嘴'
#方法
def climb(self):
print('爬')
def run(self):
print('跑')
def bite(self):
print('咬')
def eat(self):
print('吃')
def sleep(self):
print('困,睡觉')
输出:
>>> tt = Turtle()
>>> tt.sleep()
困,睡觉
>>> tt.sleep
<bound method Turtle.sleep of <__main__.Turtle object at 0x000002F3C9258190>>
>>> tt.climb
<bound method Turtle.climb of <__main__.Turtle object at 0x000002F3C9258190>>
>>> tt.climb()
爬
- 继承:
>>> class MyList(list): #创建了一个子类MyList继承自list
pass
>>> list2 = MyList()
>>> list2.append(1)
>>> list2.append(0)
>>> list2.append(9)
>>> list2
[1, 0, 9]
>>> list2.sort()
>>> list2
[0, 1, 9]
- 多态:
>>> class A:
def fun():
print('A')
>>> class B:
def fun():
print('B')
>>> A.fun()
A
>>> B.fun()
B
p38
>>> class Ball:
def __init__(self,name):
self.name = name
def kick(self):
print('我叫%s,该死的,谁踢我...' % self.name)
>>> b = Ball('土豆')
>>> b.kick()
我叫土豆,该死的,谁踢我...
- 公有和私有:
>>> class Person:
__name = 'syt'
def getName(self):
return self.__name
>>> p = Person()
>>> p.__name
Traceback (most recent call last):
File "<pyshell#47>", line 1, in <module>
p.__name
AttributeError: 'Person' object has no attribute '__name'
>>> p.getName()
'syt'
>>> p._Person__name #私有变量的另一种调用方法
'syt'
P39
>>> class Parent:
def hello(self):
print('正在调用父类的方法。。。')
>>> class Child(Parent):
pass
>>> p = Parent()
>>> p.hello()
正在调用父类的方法。。。
>>> c = Child()
>>> c.hello()
正在调用父类的方法。。。
如果在子类中定义和父类同名的方法,则子类的方法会覆盖父类:
>>> class Child(Parent):
def hello(self):
print('正在调用子类的方法...')
pass
>>> c= Child()
>>> c.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 Salmon(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方法时,出错,是因为鲨鱼中重写了父类的方法,丢失原先的变量,导致报错,解决方法:
- 调用未绑定的父类方法:
class Shark(Fish):
def __init__(self):
Fish.__init__(self) #多加了这一项
self.hungry = True
- 使用super()的方法:
class Shark(Fish):
def __init__(self):
super().__init__() #多加了这一项
self.hungry = True
多继承:
>>> class A:
def fun1(self):
print('我是A中的fun')
>>> class B:
def fun2(self):
print('我是B中的fun')
>>> class C(A,B):
pass
>>> c = C()
>>> c.fun1()
我是A中的fun
>>> c.fun2()
我是B中的fun
P40 :拾遗
>>> a = C()
>>> b = C()
>>> c = C()
>>> a.count
0
>>> b.count
0
>>> c.count
0
>>> c.count += 10
>>> c.count
10
>>> a.count
0
>>> C.count += 999
>>> c.count #---------需要注意的地方-------------
10
>>> a.count
999
>>> b.count
999
类的实例对象中的属性不能和他的方法名一样,否则会报错:
>>> class C:
def x():
print('1111')
>>> c = C()
>>> c.x = 1
>>> c.x
1
>>> c.x()
Traceback (most recent call last):
File "<pyshell#128>", line 1, in <module>
c.x()
TypeError: 'int' object is not callable
每个self,其实指的是类本身,或者对象本身:
>>> class C:
def setXY(self,x,y):
self.x = x
self.y = y
def printXY(self):
print('x = ',self.x)
print('y = ',self.y)
>>> C.setXY(2,3)
Traceback (most recent call last):
File "<pyshell#156>", line 1, in <module>
C.setXY(2,3)
TypeError: setXY() missing 1 required positional argument: 'y'
>>> C.setXY(C,2,3) #如果用类调用的话,必须要把第一个类加上(self对应的项)
>>> C.printXY(C)#这里也是要给self赋值
x = 2
y = 3
>>> C.printXY()
Traceback (most recent call last):
File "<pyshell#159>", line 1, in <module>
C.printXY()
TypeError: printXY() missing 1 required positional argument: 'self'
>>> c = C()
>>> c.setXY(2,3)#实例对象这里,会自动把self变成c
>>> c.printXY()#这里也是自动赋值self为c
x = 2
y = 3
>>> c.setXY(c,2,5)#这里报错是因为总共只需要显示赋值两个数(第一个项self已经被自动赋值为c),但是我给了三个数
Traceback (most recent call last):
File "<pyshell#163>", line 1, in <module>
c.setXY(c,2,5)
TypeError: setXY() takes 3 positional arguments but 4 were given
P40:相关BIF
- issubclass(a,b) 判断a是否为b的子类:
>>> issubclass(a,b)
True
>>> issubclass(b,a)
False
- isinstance(实例对象,类),判断实例对象是否为该类的实例
>>> class C:
def eat():
print('吃')
>>> c = C()
>>> isinstance(c,C)
True
- hasattr(实例对象,‘属性名’) 属性名这里一定要记得加上“”
>>> class C:
def setX(self,x):
self.x = x
>>> c = C()
>>> hasattr(c,'x')
False
>>> c.setX(4)
>>> hasattr(c,'x')
True
- property(getX,setX,delX)
fget – 获取属性值的函数
fset – 设置属性值的函数
fdel – 删除属性值函数
NameError: name 'x' is not defined
>>> class C:
def __init__(self,x=10):
self.x = x
def getX(self):
return self.x
def setX(self,value):
self.x = value
def delX(self):
del self.x
p = property(getX,setX,delX)
>>> c = C()
>>> c.getX()
10
>>> c.p()
Traceback (most recent call last):
File "<pyshell#48>", line 1, in <module>
c.p()
TypeError: 'int' object is not callable
>>> c.p
10
>>> c.p = 20
>>> c.p
20
>>> c.x
20
>>> del c.p
>>> c.x
Traceback (most recent call last):
File "<pyshell#54>", line 1, in <module>
c.x
AttributeError: 'C' object has no attribute 'x'
>>>