您的位置:365bet体育备用网址器 > 应用 > 类与实例,class内部定义的函数(对象的方法也可

类与实例,class内部定义的函数(对象的方法也可

2019-12-26 18:32

Python魔法方法总结及注意事项,python魔法总结

1、何为魔法方法:

  Python中,一定要区分开函数和方法的含义;

  1.函数:类外部定义的,跟类没有直接关系的;形式: def func(*argv):

  2.方法:class内部定义的函数(对象的方法也可以认为是属性);分为两种:

    ① python自动产生的(魔法方法):一般形式为 __func__(),python会在对应的时机自动调用该函数;

    ② 人为自定义的方法:一般和普通函数没有区别,只是定义在了class中而已

  3.方法与函数的区别:

    方法可认为是函数的特殊情况;

    ① 方法定义在class内部

    ② 方法的第一个参数应为 cls(类方法) 或者 self(实例方法)

2、魔法方法汇总:

Python 魔法方法汇总

方法

描述

备注

1、基本方法

__new__(cls[,*argv])

 1. __new__ 是在一个对象实例化的时候所调用的第一个方法

  1. 它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法
  2. __new__ 决定是否要使用该 __init__ 方法,因为 __new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__ 没有返回实例对象,则 __init__ 不会被调用
  3. __new__ 主要是用于继承一个不可变的类型比如一个 tuple 或者 string

 cls:代表一个类的名称

self:代表一个实例对象的名称

 __init__(self[,*argv])

 构造器,当一个实例对象被定义时调用

类似于C++的构造函数

 __del__(self)

析构器,当删除一个实例对象时调用

类似于C++的析构函数

 __call__(self[,*argv]) 

允许一个类像函数一样被调用  

class_x(a,b)实际调用的是class_x.__call__(a,b)

 __len__(self)

获得实例对象的长度

与调用函数 len(obj)一样的结果

 __repr__(self)

将实例对象转化为字符串的形式

如 ls=[1,2,3], 则repr(ls)为 '[1,2,3]',与函数repr(obj)功能相同

 __str__(self)

 将实例对象转化为字符串的形式

与repr()的区别在于:str(obj)的字符串是打印出来让人看的,更加亲民,而repr(obj)是给解释器看的;

若 a = xxx(列表、字典、元祖或集合等)

eval(repr(a)) == a  成立

eval(str(a)) == a    不一定成立

__int__(self)

定义当被 int() 调用时的行为

 

__float__(self) 

定义当被 float() 调用时的行为

 

__round__(self[, n])

当被round()调用时的行为

round(digit[, n]) 将digit数字保留n位精度

 __hash__(self)

定义能被 hash() 调用的行为

 

 __bytes__(self)

 定义被 bytes() 调用的行为

 

 __bool__(self)

定义被 bool() 调用的行为

返回True(1) 或 False(0)

 __format__(self, form)

定义被 format()调用的行为

 

2、运算符方法

 __add__(self, other)

加法:+

 

__sub__(self, other)

减法:-

 

__mul__(self,other)

乘法:*

 

__truediv(self, other)

除法:/

注意是 truediv

__floordiv(self, other)

整数除法://

 floor()即为向下取整的意思

__mod__(self, other)

求余:%

 

__pow__(self, other[, mod])

乘方:**

 pow(x,y[,z]),

若无Z,则为 return x**y

若有Z,则为 return x**y%z

__divmod__(self, other)

divmode()

返回值为元祖  (商值,余数)

__lshift__(self, other)

左移:<<

 

__rshift__(self, other)

右移:>>

 

__and__(self, other)

按位与:&

注意以下均为按位操作,非逻辑操作

__or__(self, other)

按位或:|

 

__xor__(self, other)

按位异或:^

 

 3、反运算符方法  

 __radd__(self, other)

加法,如a+b,当a不支持__add__()操作时,调用此函数;

即在运算符的基础上加上 'r' 即可,以下雷同

 __rsub__(self, other)

other - self

 

 …………

 

 

 4、增量赋值运算符方法  

 __iadd__(self, other)

365bet在线官网,赋值加法:+=  

即在赋值运算符之前加 'i' ,以下雷同

__isub__(self, other)

赋值减法:-=

self = self - other

…………

 

 

5、一元操作符方法  

__pos__(self)

定义正号:+x

 

__neg__(self)

定义负号:-x

 

__abs__(self)

取绝对值

 

__invert__(self)

按位求反:~x

 

6、比较操作符方法  

__gt__(self, other)

大于:>

 

__ge__(self, other)

大于等于:>=

 

__lt__(self, other)

小于:<

 

__le__(self, other)

小于等于:<=

 

__eq__(self, other)

相等:==

 

__ne__(self, other)

不等:!=

 

7、属性操作  

__getattr__(self, name)

当用户访问一个不存在的属性时调用

注意 object/super() (所有类的基类) 是无该方法的

__getattribute(self, name)

访问存在的属性时调用

先调用此函数,如找不到该属性,再去调用上面的属性

__setattr__(self, name, value)

设置属性时调用

 

__delattr__(self, name)

删除一个属性时调用

 

property(fget=None, fset=None, fdel=None, doc=None)

是一个类,主要功能是为了方便类内部函数的调用

 1 class C(object):
 2     def getx(self): return self._x
 3     def setx(self, value): self._x = value
 4     def delx(self): del self._x
 5     x = property(getx, setx, delx, "I'm the 'x' property.")
 6 
 7     
 8 >>> c=C()
 9 >>> c.x=10
10 >>> c.x
11 10

__get__(self, instance, owner)

描述符被访问时调用

想详细了解,请点击这里

 __set__(self, instance, value)

描述符被改变时调用

 

  __delelte__(self, instance, value)

删除描述符时调用

 

8、容器类型操作  

__getitem__(self, key)

获取容器中指定元素的行为

 

__setitem__(self, key, value)

设置容器中指定元素的行为

 

__delitem__(self, key)

删除容器中指定元素的行为

 

__iter__(self)

定义迭代器中元素的行为

 

__reversed__(self)

当调用reversed()函数时

 

__contains__(self, item)

成员运算符in/ not in的行为

 

   

 PS: ①.以上所有的魔法方法,君采用__xx__形式(__为双 "_",双下划线)

   ②.以上魔法方法为Python解释器自动调用,当然也可以手动调用

   ③.魔法方法Python解释器自动给出默认的,因此除非需要改变其内部功能,其它时刻刻使用默认魔法方法

   ④.魔法方法是针对class而言的,脱离了”类“谈magic_method是没有意义的

   ⑤.*argv为可变的参数列表,类似C语言的va(variable argument),注意与指针的区别,python中暂时忘掉指针,因为python的内存机制都是解释器自动完成的

1、何为魔法方法: Python中,一定要区分开函数和方法的含义; 1.函数:类外部定义的,跟类...

python类及其方法,python类方法

                 python类及其方法

一、介绍

在 Python 中,面向对象编程主要有两个主题,就是类和类实例
类与实例:
类与实例相互关联着:类是对象的定义,而实例是"真正的实物",它存放了类中所定义的对象
的具体信息。

类有这样一些的优点:

1、类对象是多态的:也就是多种形态,这意味着我们可以对不同的类对象使用同样的操作方法,而不需要额外写代码。
2、类的封装:封装之后,可以直接调用类的对象,来操作内部的一些类方法,不需要让使用者看到代码工作的细节。
3、类的继承:类可以从其它类或者元类中继承它们的方法,直接使用。

二、类的定义

1.定义类(class)的语法

1 >>> class Iplaypython:
2 >>>     def fname(self, name):
3 >>>           self.name = name

一第行,语法是class 后面紧接着,类的名字,最后别忘记“冒号”,这样来定义一个类。
类的名字,首字母,有一个不可文的规定,最好是大写,这样需要在代码中识别区分每个类。
第二行开始是类的方法,大家看到了,和函数非常相似,但是与普通函数不同的是,它的内部有一个“self”,参数,它的作用是对于对象自身的引用。

2.初始化对象

创建类时,可以定义一个特定的方法,名为__init__(),只要创建这个类的一个实例就会运行这个方法。可以向__init__()方法传递参数,这样创建对象时就可以把属性设置为你希望的值__init__()这个方法会在创建对象时完成初始化

1 >>> class peo:
2 ...     def __init__(self,name,age,sex):
3 ...             self.Name = name
4 ...             self.Age = age
5 ...             self.Sex = sex
6 ...     def speak(self):
7 ...             print "my name" + self.Name
8 ... 

实例化这个类的对象时:

1 >>> zhangsan=peo("zhangsan",24,'man')
2 >>> print zhangsan.Age
3 24
4 >>> print zhangsan.Name
5 zhangsan
6 >>> print zhangsan.Sex
7 man

之前多次用到self这个形参类就好比是一张蓝图,使用一个类可以创建多个对象实例,speak()方法在被调用时,必须知道是哪个对象调用了它.

这里self参数就会告诉方法是哪个对象来调用的.这称为实例引用。

 

3.类的私有属性:

  __private_attrs 两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs
类的方法
  在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数
私有的类方法
  __private_method 两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用slef.__private_methods

 

4. classmethod类方法

1) 在python中.类方法 @classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。
2) 普通对象方法至少需要一个self参数,代表类对象实例
3)类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。 对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。

 1 class info(object):
 2 
 3   @classmethod
 4   def sayclassmethod(cls):
 5 
 6     print 'say %s' % cls
 7 
 8   def saymethod(self):
 9 
10     print 'say %s' % self
11 
12 
13 test = info()
14 test.saymethod()##实例调用方法
15 test.sayclassmethod()##实例调用类方法
16 info.saymethod(test)##类调用实例方法
17 info.sayclassmethod()##类调用类方法

大家对比运行下。

 

5.类的装饰器@property

 1 class Pager:
 2     def __init__(self,all_count):
 3         self.all_count=all_count
 4     @property
 5     def all_pager(self):
 6         a,b=divmod(self.all_count,10)
 7         if a==0:
 8             return a
 9         else:
10             return  a+1
11 
12     @all_pager.setter
13     def all_pager(self,value):
14         print(value)
15 
16     @all_pager.deleter
17     def all_pager(self):
18         print('hehe')
19 p=Pager(101)
20 ret=p.all_count#以访问类属性的方法访问对象的方法
21 print(ret)

下面看第二种方法

 1 class Pager:
 2     def __init__(self,all_count):
 3         self.all_count=all_count
 4     def f1(self):
 5         return 123
 6     def f2(self,value):
 7         print('======')
 8     def f3(self):
 9         print('+++++++')
10 
11     foo=property(fget=f1,fset=f2,fdel=f3)
12 p=Pager(101)
13 ret=p.foo
14 p.foo='alex'
15 print(p.foo)
16 del p.foo

在该类中定义三个函数,分别用作赋值、取值、删除变量

property函数原型为property(fget=None,fset=None,fdel=None,doc=None),上例根据自己定义相应的函数赋值即可。

 

 

三、继承类定义:
1.单继承

class <类名>(父类名)
<语句>

1 class childbook(book)
2     age = 10

#单继承示例

 1  class student(people):  
 2         grade = ''  
 3         def __init__(self,n,a,w,g):  
 4             #调用父类的构函  
 5             people.__init__(self,n,a,w)  
 6             self.grade = g  
 7         #覆写父类的方法  
 8         def speak(self):  
 9             print("%s is speaking: I am %d years old,and I am in grade %d"%(self.name,self.age,self.grade))       
10 
11     s = student('ken',20,60,3)  
12     s.speak()

 

2.类的多重继承
class 类名(父类1,父类2,....,父类n)
<语句1>

需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索,即方法在子类中未找到时,从左到右查找父类中是否包含方法

#另一个类,多重继承之前的准备  

1 class speaker():  
2     topic = ''  
3     name = ''  
4     def __init__(self,n,t):  
5         self.name = n  
6         self.topic = t  
7     def speak(self):  
8         print("I am %s,I am a speaker!My topic is %s"%(self.name,self.topic))  

#多重继承  

1 class sample(speaker,student):  
2     a =''  
3     def __init__(self,n,a,w,g,t):  
4         student.__init__(self,n,a,w,g)  
5         speaker.__init__(self,n,t)  
6 
7 test = sample("Tim",25,80,4,"Python")  
8 test.speak()#方法名同,默认调用的是在括号中排前地父类的方法

 

 

四、类的专业方法

Python 类可以定义专用方法,专用方法是在特殊情况下或当使用特别语法时由 Python 替你调用的,而不是在代码中直接调用(象普通的方法那样)。

1 __init__
类似于构造函数

1 #!/usr/local/bin/python
2 class Study:
3         def __init__(self,name=None):
4                 self.name = name
5         def say(self):
6                 print self.name
7 study = Study("Badboy")
8 study.say()

2 __del__
类似于析构函数

 1 #!/usr/local/bin/python
 2 class Study:
 3         def __init__(self,name=None):
 4                 self.name = name
 5         def __del__(self):
 6                 print "Iamaway,baby!"
 7         def say(self):
 8                 print self.name
 9 study = Study("zhuzhengjun")
10 study.say()

3__repr__
使用repr(obj)的时候,会自动调用__repr__函数,该函数返回对象字符串表达式,
用于重建对象,如果eval(repr(obj))会得到一个对象的拷贝。

 1 #!/usr/local/bin/python
 2 class Study:
 3         def __init__(self,name=None):
 4                 self.name = name
 5         def __del__(self):
 6                 print "Iamaway,baby!"
 7         def say(self):
 8                 print self.name
 9         def __repr__(self):
10                 return "Study('jacky')"
11 study = Study("zhuzhengjun")
12 study.say()
13 print type(repr(Study("zhuzhengjun"))) # str
14 print type(eval(repr(Study("zhuzhengjun")))) # instance
15 
16 study = eval(repr(Study("zhuzhengjun")))
17 
18 study.say()

4__str__
Python能用print语句输出内建数据类型。有时,程序员希望定义一个类,要求它的对象也能用print语句输出。Python类可定义特殊方法__str__,为类的对象提供一个不正式的字符串表示。如果类的客户程序包含以下语句:

print objectOfClass
那么Python会调用对象的__str__方法,并输出那个方法所返回的字符串。

 1 #!/usr/local/bin/python
 2 
 3 class PhoneNumber:
 4         def __init__(self,number):
 5                  self.areaCode=number[1:4]
 6                  self.exchange=number[6:9]
 7                  self.line=number[10:14]
 8 
 9         def __str__(self):
10                 return "(%s) %s-%s"%(self.areaCode,self.exchange,self.line)
11 
12 def test():
13          newNumber=raw_input("Enter phone number in the form. (123) 456-7890: n")
14          phone=PhoneNumber(newNumber)
15          print "The phone number is:"
16          print phone
17 
18 if__name__=="__main__":
19          test()

方法__init__接收一个形如"(xxx) xxx-xxxx"的字符串。字符串中的每个x都是电话号码的一个位数。方法对字符串进行分解,并将电话号码的不同部分作为属性存储。

方法__str__是一个特殊方法,它构造并返回PhoneNumber类的一个对象的字符串表示。解析器一旦遇到如下语句:

print phone

就会执行以下语句:

print phone.__str__()

程序如果将PhoneNumber对象传给内建函数str(如str(phone)),或者为PhoneNumber对象使用字符串格式化运算符%(例如"%s"%phone),Python也会调用__str__方法。

5__cmp __
比较运算符,0:等于 1:大于 -1:小于

class Study:  
     def __cmp__(self, other):  
         if other > 0 :  
             return 1  
         elif other < 0:  
             return - 1  
         else:  
             return 0  

study = Study()  
if study > -10:print 'ok1'  
if study < -10:print 'ok2'  
if study == 0:print 'ok3' 

打印:ok2 ok3
说明:在对类进行比较时,python自动调用__cmp__方法,如-10 < 0 返回 -1,也就是说study 应该小与 -10,估打印ok2

6__getitem__
__getitem__ 专用方法很简单。象普通的方法 clear,keys 和 values 一样,它只是重定向到字典,返回字典的值。

 1 class Zoo:  
 2      def __getitem__(self, key):  
 3          if key == 'dog':return 'dog'  
 4          elif key == 'pig':return  'pig'  
 5          elif key == 'wolf':return 'wolf'  
 6          else:return 'unknown'  
 7    
 8 zoo = Zoo()  
 9 print zoo['dog']  
10 print zoo['pig']  
11 print zoo['wolf']

打印 dog pig wolf

7__setitem__
__setitem__ 简单地重定向到真正的字典 self.data ,让它来进行工作。

 1 class Zoo:  
 2      def __setitem__(self, key, value):  
 3          print 'key=%s,value=%s' % (key, value)  
 4    
 5 zoo = Zoo()  
 6 zoo['a'] = 'a'  
 7 zoo['b'] = 'b'  
 8 zoo['c'] = 'c'
 9 打印:
10 key=a,value=a
11 key=b,value=b
12 key=c,value=c

8 __delitem__
__delitem__ 在调用 del instance[key] 时调用 ,你可能记得它作为从字典中删除单个元素的方法。当你在类实例中使用 del 时,Python 替你调用 __delitem__ 专用方法。

1 class A:  
2      def __delitem__(self, key):  
3          print 'delete item:%s' %key  
4    
5 a = A()  
6 del a['key'] 

 

python类及其方法 一、介绍 在 Python 中,面向对象编程主要有两个主题,就是类和类实例 类与实例: 类与实例...

本文由365bet体育备用网址器发布于应用,转载请注明出处:类与实例,class内部定义的函数(对象的方法也可

关键词: