Python—类和对象(二)

 

 

有的时候继承和多继承都不太适合使用,我们可以使用组合。当然这并不是绝对的要视情况而定。

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

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

class P:
      def __init__(self,x,y):
            self.T = T(x)
            self.F = F(y)
      def print_num(self):
            print('有乌龟%d只,有鱼%d条 ' %(self.T.num,self.F.num))
      

看一下运行结果:

>>> p = P(2,8)
>>> p.print_num()
有乌龟2只,有鱼8条 
>>> 

类、类对象和实例对象

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

 如果属性的名字和方法的名字相同属性会把方法覆盖掉:

>>> class C:
	def x(self):
		print('!!!!!!')

		
>>> c = C()
>>> c.x()
!!!!!!
>>> c.x = 1
>>> c.x
1
>>> c.x()
Traceback (most recent call last):
  File "<pyshell#146>", line 1, in <module>
    c.x()
TypeError: 'int' object is not callable
>>> 

为了避免这种情况出现我们可以多使用 继承、组合以及在命名的时候 方法用动词,属性用名词。

绑定

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

>>> class C:
	def setxy(self,x,y):
		self.x = x
		self.y = y
	def printxy(self):
		print(self.x,self.y)

		
>>> d = C()
>>> d.__dict__
{}
>>> C.__dict__
mappingproxy({'__module__': '__main__', 'setxy': <function C.setxy at 0x0000018B41B7A7B8>, 'printxy': <function C.printxy at 0x0000018B41B7A840>, '__dict__': <attribute '__dict__' of 'C' objects>, '__weakref__': <attribute '__weakref__' of 'C' objects>, '__doc__': None})
>>> d.setxy(6,7)
>>> d.printxy()
6 7
>>> d.__dict__
{'x': 6, 'y': 7}
>>> C.__dict__
mappingproxy({'__module__': '__main__', 'setxy': <function C.setxy at 0x0000018B41B7A7B8>, 'printxy': <function C.printxy at 0x0000018B41B7A840>, '__dict__': <attribute '__dict__' of 'C' objects>, '__weakref__': <attribute '__weakref__' of 'C' objects>, '__doc__': None})
>>> 

一些与类和对象相关的BIF:

1、issubclass(class ,classinfo)

检查一个类是不是一个类的子类,是就返回True不是就返回False

需要注意的是:(1)一个类会被认为是自身的子类,(2)classinfo可以是类对象组成的元组,只要class与其中任何 一个候选类的子类,就赶回True

>>> class A:
	pass

>>> class B(A):
	pass

>>> issubclass(B,A)
True
>>> issubclass(B,B)
True
>>> issubclass(B,object)
True
>>> class  C:
	pass

>>> issubclass(B,C)
False
>>> 

2、isinstance(object ,classinfo )

检查一个实例对象是不是属于一个类,有就返回True没有就返回False

需要注意的是:(1)如果第一个参数不是对象,则永远返回False

>>> b = B()
>>> isinstance(b,B)
True
>>> isinstance(b,C)
False
>>> isinstance(b,(A,B,C))
True
>>> 

访问类的属性 :

1、hasattr(object , name)测试一个对象里面是不是有对应的属性

需要注意的是在写属性的时候要用单引号括起来

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

		
>>> c = C()
>>> hasattr(c,'x')
True
>>> 

2、getattr(object , name[ , default] )返回对象指定的属性值,如果指定的属性不存在会打印设置的defaul

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

		
>>> c = C()
>>> getattr(c,'y',"访问的属性不存在")
'访问的属性不存在'
>>> getattr(c,'x',"访问的属性不存在")
0
>>> 

3、setattr(object ,  name  ,  vaslue)设置对象中指 定属性的值,指定的属性不存在会新建新的属性

>>> setattr(c,'y','xiaoyi')
>>> getattr(c,'y',"访问的属性不存在")
'xiaoyi'
>>> 

4、delattr(object , name)删除对象中指定的属性,不存在会出异常

通过属性来设置属性: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)

	
>>> b = C()
>>> b.x
10
>>> b.x = 18
>>> b.x
18
>>> del b.x

property在面向用户体验的时候非常的适用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值