小白学python6

小白学python6

一、和类、对象相关的BIF(内置函数)
1.issubclass(子类名class,父类名classinfo):class是classinfo 的子类则返回true

>>> class A:
	 pass

	
>>> class B(A):
	pass

>>> issubclass(B,A) //B是A的子类返回True
True
>>> issubclass(B,B)
True
>>> issubclass(A,B)
False

2.isinstance(实例object,类\元组classinfo)检查一个实例是否属于一个类

>>> class C:
	pass

>>> b=B()
>>> isinstance(b,B)  //b是B的子类,返回True
True
>>> isinstance(b,A)
True
>>> isinstance(b,C)
False
>>> 

3.hasattr(对象obect,name属性名);判断对象是否有属性名,其中属性名要用‘’引住

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

		
>>> c=C()
>>> hasattr(c,'x')
True
>>> getattr(c,'y',"您检索的属性不存在")
'您检索的属性不存在'
>>> 

4.getattr(对象obect,name属性名):获得对象的属性名
5.setattr(对象obect,name属性名):设置对象的属性名
6.delattr(对象obect,name属性名):删除对象的属性名
7.property(getSize,setSize,selSize):分别是 获取属性的方法、设置属性的方法、删除属性的方法

>>> 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.getSize()
18
>>> 
>>> del c1.x
>>> c1.x
Traceback (most recent call last):
  File "<pyshell#59>", line 1, in <module>
    c1.x
  File "<pyshell#51>", line 5, in getSize
    return self.size
AttributeError: 'C' object has no attribute 'size'
>>> 

二、魔法方法(类似于构造函数和析构函数),使用双下划线
1.init(self)第一个参数是self
通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。

>>> class Rectangle:
	def __init__(self,x,y):
		self.x=x
		self.y=y
	def getP(self):
		return (self.x+self.y)*2
	def getA(self):
		return(self.x*self.y)
>>> r=Rectangle(2,3)
>>> r.getP()
10
>>> r.getA()
6
>>> 

2.new(cls)是第一个被调用的方法
通常用于控制生成一个新实例的过程。它是类级别的方法。
①当我们在继承一些不可变的类时(比如int, str, tuple),我们可以通过这个方法自定义这些不可变类的实例化过程。

我们用int类来举例:

假如我们需要一个永远都是正数的整数类型,可以通过继承int类,然后可能会写出这样的代码:

class PositiveInteger(int):
    def __init__(self, value):
        super(PositiveInteger, self).__init__(self, abs(value))
 
i = PositiveInteger(-3)
print i

运行后发现该还是-3,这是因为int是不可变类型,所以这个时候就需要重载__new__()方法,才能起到自定义的作用:

class PositiveInteger(int):
    def __new__(cls, value):
        return super(PositiveInteger, cls).__new__(cls, abs(value))
 
i = PositiveInteger(-3)
print i

②可以用__new__()方法来实现单例:

class Singleton(object):
    def __new__(cls):
        # 关键在于这,每一次实例化的时候,我们都只会返回这同一个instance对象
        if not hasattr(cls, 'instance'):
            cls.instance = super(Singleton, cls).__new__(cls)
        return cls.instance

obj1 = Singleton()
obj2 = Singleton()
obj1.attr1 = 'value1'

print(obj1.attr1, obj2.attr1)   #value1 value1
print(obj1 is obj2) #True

可以看出obj1和obj2是同一个实例。
3.del(self)

>>> class C:
	def __init__(self):
		print("我是__init__方法,我被调用了")
	def __del__(self):
		print("我是__del__方法,我被调用了")

		
>>> c1=C()
我是__init__方法,我被调用了 //当类C被实例化是就开始调用__init__函数
>>> c2=c1
>>> c3=c2
>>> del c3
>>> del c2
>>> del c1
我是__del__方法,我被调用了  //当所有对于类C的引用全部del之后,类C里面的del方法才会被调用

>>> 

三、工厂函数(实质是系统类的实例对象)
1.魔法方法是可以修改的,修改之后可以直接打入系统内部让自己的算法变得更加流畅

>>> class int(int):
	def __add__(self,other):
		return int.__sub__(self,other)

	
>>> a=int('5')
>>> a
5
>>> b=int(3)
>>> a+b  //这里在进行+这个运算时,实际上系统调用的是sub(减)这个操作
2
>>> 

2.反运算

>>> class Nint(int):
	def __rsub__(self,other):
		return int.__sub__(other,self) //变换顺序之后是3-a

	
>>> a=Nint(5)
>>> 3-a
-2
>>> 

3.python中“==”是判断两个变量的值是否相等;
“is” 则是用来判断两个变量的 id 是否相等,当两个变量的 id 相等时,说明这两个变量指向的地址是相同的,那么这两个变量的一切属性(包括:类型、值)都相同。同时,Python 也规定 None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()都相当于 False。所以我们可以使用 is 来判断变量是否为空。
“=”是用来赋值的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值