2.8

2020.2.8

对象(属性、方法)

例一:

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("睡")

oo的特征(Object Oriented)

1、封装:信息隐蔽技术

2、继承:子类自动共享父类之间数据和方法的机制

3、多态:不同对象对同一方法响应不同的行动


​ OOA:面向对象分析

面向对象 OOD:面向对象设计

​ OOP:面向对象编程


self:当一个对象的方法被调用时,对象会将自身传递给self参数

​ ——init——(self):构造方法,在实例化一个对象的时候,这个方法就会在对象被创建的时候自动调用

class Ball:
	def__init__(self,name):
		self.name = name
	def kick(self):
		print("我叫%s,该死的,谁踢我..."% self.name)

b = ball('土豆')
b.kick()
输出:
我叫土豆,该死的,谁踢我...

共有和私有:在PYTHON中定义私有变量只需要在变量名或者函数名前面加上“__”两个下划线,那么这个函数或变量就会为私有的了

​ name mangling:名字改编,名字重整

例二:

class Person:
	name = 'yyqx'

p = Person()
p.name
输出:
yyqx
class Person:
	__name = 'yyqx'
	def getName(self):
		return self.__name

p = Person()
p.getName()
输出:
yyqx
p._Person__name
输出:
yyqx

题目:我们试图模拟一个场景,里边有一只乌龟和十条鱼,乌龟通过吃鱼来补充体力,当乌龟体力消耗殆尽或者鱼被吃光则游戏结束,并给鱼进行细分,有金鱼(Goldfish),鲫鱼(Carp),三文鱼(Salmon),鲨鱼(Shark)。(能不能不要每次都从头到尾去重新定义一个新的鱼类呢?因为我们知道大部分鱼的属性和方法是相似的)

例如:
      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("儿女")
      c = Child()
      c.hello()	
      #输出:
      #儿女
      p.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 Crap(Fish):
	pass
class Salmon(Fish):
	pass
class Shark(Fish):
	def __init__(self):
		Fish.__init__(self)
		self.hungry = True
	
	def eat(self):
		if self.hungry:
			print("Eating")
			self.hungry = False
		else:
			print("Not Eating")
			


方法二:使用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 Crap(Fish):
	pass
class Salmon(Fish):
	pass
class Shark(Fish):
	def __init__(self):
		super().__init__()
		self.hungry = True
	
	def eat(self):
		if self.hungry:
			print("Eating")
			self.hungry = False
		else:
			print("Not Eating")

多重调用:同时继承多个父类的方法

class Base1:
	def foo1(self):
		print("Base1")

class Base2:
	def foo2(self):
		print("Base2")
		
class C(Base1,Base2):
	pass
c = C()
c.foo1()
输出:
Base1
c.foo2()
输出:
Base2

组合:将横向的类组合在一起(Mix-in)

题目:定义一个类,叫水池,水池里要有乌龟和鱼

class Turtle:
	def __init__(self,x)
		self.num = x

class Fish:
	def __init__(self,y)
		self.num = y

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

类、类对象、实例对象

举例:类(class C)、类对象 (C)、实例对象 (a,b,c)

class C:
	count = 0
a = C()
b = C()
c = C()
a.count #0
b.count #0
c.count #0
c.count += 10
c.count #10
a.count #0
b.count #0
C.count #0
C.count += 100
a.count #100
b.count #100
c.count #10

注意:

1、不要试图在一个类里边定义出所有能想到的特征和方法,应该利用继承和组合机制来进行扩展

2、用不同的词性命名,如属性名用名词,方法名用动词


绑定:Python严格要求方法需要有实例才能被调用,这种限制就是所谓的绑定概念

类和对象相关的BIF

issubclass(class,classinfo):若class是classinfo的子代,则返回True

​ 注意:

​ 1、一个类被认为是其自身的子类

​ 2、classinfo可以是类对象组成的元组,只要class与其中任何一个候选类的子类,则返回True

isinstance(object,classinfo):检查一个对象是否属于一个类的实例对象

​ 注意:

​ 1、如果第一个参数不是对象,则永远返回False

​ 2、如果第二个参数不是类或者由类对象组成的元组,则会抛出一个TypeError异常

hasattr(object,name):用于判断对象是否包含指定的属性

class C:
	def __init__(self,x = 0):
		self.x = x

c1 = C()
hassattr(c1,'x')
输出:
True

getattr(object,name[,default]):用于返回一个对象属性值

​ 注意:

​ 1、如果对象属性值存在则返回其默认值

​ 2、若对象属性不存在则返回AttributeError异常

setattr(object,name,value):设置指定对象某个属性的值,若指定的属性不存在,则新建属性并赋值

delattr(object,name):删除指定对象某个属性的值,若指定的属性不存在,则抛出AttributeError的异常

property(fget = None,fset = None,fdel = None,doc = None):在新式类中返回属性值

class C:
	def __init__(self,size = 10):
		self.size = size
	def getSize(self):
		return self.size
	def setSize(self,value)
		self.size = value
	def delSize(self):
		del self.size
	x = property(getSize,setSize,delSize)

c1 = C()
c1.getSize()
#输出:
#10
c1.x
#输出:
#10
c1.x = 18
c1.x
#输出:
#18
c1.size
#输出:
#18
c1.getSize()
#输出:
#18
del c1.x
c1.size
#抛出AttributeError异常
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值