类和对象

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'
>>> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值