|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #coding=UTF-8
- #知识点总结
- """
- 1.魔法方法详解 http://bbs.fishc.org/thread-48793-1-1.html
- 2.__new__(cls [, ...]): 是一个对象实例化时所调用的第一个方法, 第一个参数是类(cls), 其他参数会直接传递给__init__方法
- __new__ 返回实例对象, 通常是参数cls这个参数的实例化对象, 也可以返回其他对象.
- 3. __init__(self [, ...]): 当实例对象有明确的初始化步骤时改写__init__()
- 4. __del__(self): 当对象将被销毁的时候调用, 销毁指的是垃圾回收机制回收这个对象
- 5.python3以后, int(), float(), list(), str()等工厂函数的调用实际上就是创建类的实例化对象的过程, 工厂函数就是类对象
- 6.当对实例对象进行算术运算时, 会自动调用算术运算的魔法方法
- 运算符 对应的魔法方法
- + __add__(self, other)
- - __sub__(self, other)
- * __mul__(self. other)
- / __truediv__(self, other)
- // __floordiv__(slef, other)
- % __mod__(self, other)
- ** __pow__(self, other[, modulo])
- << __lshift__(self, other)
- >> __rshift__(slef, other)
- & __and__(self, other)
- ^ __xor__(self, other)
- | __or__(self, other)
- 例如, 当 a + b 时, 会自动调用 __add__() 方法, 可以通过修改魔法方法来自定义算术运算
- """
- #1.
- class CapStr(str): #定义一个继承自str的类
- def __new__(cls,string):
- string = srting.upper()
- return str.__new__(cls,string)
- a=CapStr("I love you")
- print(a)
- #2.
- class Rectangle:
- def __init__(self,x,y): #重新定义初始化函数
- self.x=x
- self.y=y
- def getperi(self):
- return (self.x+self.y)*2
- def getarea(self):
- return self.x*self.y
- rect=Rectangle(3,4)
- print(rect.getperi())
- print(rect.getarea())
- #3.
- class C:
- def __init__(self):
- print("我是_init_方法,我被调用了....")
- def __del__(self):
- print("我是_del_方法,我被调用了....")
- c1=C()
- c2=c1
- c3=c2
- del c3
- del c2
- del c1
- #4.
- class Try_int(int):
- def __add__(self, other):
- return int (self) + int(other)
- def __sub__(self, other):
- return int(self) - int(other)
- a=Try_int(3)
- b=Try_int(5)
- print(a+b)
- #5.
- class Nint(int):
- def __new__(cls, arg = 0):
- if type(arg) == type(str):
- total = 0
- for each_str in arg:
- total += ord(each_str)
- arg = total
- return int.__new__(cls, arg)
- #6. 反运算的魔法方法,当左操作数不支持相应操作时被调用
- # 例如__radd__, a + b, 当a对象没有__add__方法时, b对象才会调用__radd__:
- class Nint(int):
- def __radd__(self, other):
- print("__radd__ 被调用了!")
- return int.__sub__(self, other)
- a = Nint(5)
- b = Nint(3)
- print(a+b)
- print(1 + b) #调用__radd__(self, other),其中self为b,other为1
- print(3-a) #这是自动调用的是_sub_函数,即__sub__(3, a)
- class Nint(int):
- def __rsub__(self, other):
- return int.__sub__(self,other)
- a=Nint(5)
- print(3-a) #调用函数__rsub__(self, other),其中self为a
- #
- """
- #在继承的类中调用基类的方法, 使用super()
- #对于修饰符@staticmethod, 表示紧跟的一个方法为静态方法, 静态方法不会绑定到实例对象上, 可以节省开销,
- # 所以定义静态方法时不需要传入self参数, 当对象访问时也不会传入self参数, 例如:
- class C:
- @staticmethod # 该修饰符表示 static() 是静态方法
- def static(arg1, arg2, arg3):
- print(arg1, arg2, arg3, arg1 + arg2 + arg3)
- def nostatic(self):
- print("I'm the f**king normal method!")
- c1 = C()
- c2 = C()
- # 静态方法只在内存中生成一个,节省开销
- print(c1.static is C.static)
- print(c1.nostatic is C.nostatic)
- print(c1.static)
- print(c2.static)
- print(C.static)
- # 普通方法每个实例对象都拥有独立的一个,开销较大
- print(c1.nostatic)
- print(c2.nostatic)
- print(C.nostatic)
- print(c1.static(1, 2, 3))
- print(C.static(1, 2, 3))
- """
复制代码 |
|