Review 41 ~ 42 magic cube method in python

Magic cube method:

Structure and Deconstruction:

1: Constructor

__new__(cls[,...])

When you inherit an immutable type and need to modify it, you can override it with this method
The main function is to return an instance object when an object is instantiated, which is usually the instantiated object of the parameter cls class. If so, other objects can also be returned.

>>> class Capstr(str):
	def __new__(cls,string):
		string = string.upper()
		return str.__new__(cls,string)

	
>>> a=Capstr('I love carrot')
>>> a
'I LOVE CARROT'

2: Destructor

__del__(self)

This method will be called when the object is to be destroyed, and the garbage collection mechanism will not be enabled until all references to the generated object are del.

>>> class A:
	def __init__(self):
		print('I am__init_Method, I was called')
	def __del__(self):
		print('I am__del_Method, I was called')

		
>>> a1=A()
I am__init_Method, I was called
>>> a2=a1
>>> a3=a2
>>> del a2
>>> del a1
>>> del a3
 I am__del_Method, I was called

When the instance object needs to have explicit initialization steps, you can use the following methods

__init__(self)
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)  
rect.getPeri()
output 
14  
rect.getArea() 
output
12 

Attention_ init_ _ () the return value of the method must be None and cannot be anything else

>>> class Test:
	def __init__(self,x,y):
		return x+y

	
>>> t=Test(3,4)
Traceback (most recent call last):
  File "<pyshell#65>", line 1, in <module>
    t=Test(3,4)
TypeError: __init__() should return None, not 'int'

Arithmetic operation:

Objects can be calculated

>>> a=int('123')
>>> b=int('456')
>>> c=float('345')
>>> a+b
579
>>> a+c
468.0

python's magic cube method can also customize the numerical processing of objects

methodeffect
add(self,other)Define the behavior of addition
sub(self,other)Define the behavior of subtraction
mul(self,other)Defines the behavior of multiplication
truediv(self,other)The act of defining true division
floordiv(self,other)Defines the behavior of integer division
mod(self,other)Define the behavior of the modulo algorithm
divmod(self,other)Defines the behavior when divmod() is called (a\b remainder)
pow(self,other)Defines the behavior when called by power() or * * operation
lshift(self,other)Defines the behavior of bitwise left shift
rshift(self,other)Defines the behavior of bitwise right shifting
and(other)Define the behavior of installation and operation&
xor(self,other)Define the behavior of bitwise XOR operations:^
or(self,other)Defines the behavior of bitwise or operations
>>> class New_int(int):
	def __add__(self,other):
		return int.__sub__(self,other)
	def __sub__(self,other):
		return int.__add__(self,other)

	
>>> a=New_int(3)
>>> b=New_int(5)
>>> a+b
-2
>>> a-b
8
#+Return -, - return+

Here, an infinite recursive loop is entered, because self binds to A. when a+b is executed, return self+other is a+b again, and a+b keeps looping.

>>> class Try_int(int):
	def __add__(self,other):
		return self+other
	def __sub__(self,other):
		return self-other

	
>>> a=Try_int(3)
>>> b=Try_int(5)
>>> a+b
Traceback (most recent call last):
  File "<pyshell#53>", line 1, in <module>
    a+b
  File "<pyshell#49>", line 3, in __add__
    return self+other
  File "<pyshell#49>", line 3, in __add__
    return self+other
  File "<pyshell#49>", line 3, in __add__
    return self+other
  [Previous line repeated 1022 more times]
RecursionError: maximum recursion depth exceeded

It can be improved as follows:

>>> 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)
>>> a+b
8
>>> a-b
-2

Exercise:

1: Wrap the file object so that the file can be closed automatically when the object is deleted

>>> class Fileclose:
	def __init__(self,filename='D:\\carrot1.txt'):
		self.file=open(filename,'r',encoding='utf-8')
	def __del__(self):
		self.file.close()
		del self.file

2: Define a class to realize the conversion from Celsius to Fahrenheit (Fahrenheit = Celsius * 1.8 + 32)

>>> class Cs(float):
	'Converting degrees Celsius to degrees Fahrenheit'
	def __new__(cls,arg):
		return float.__new__(cls,arg*1.8+32)
>>> cs=Cs(9)
>>> cs
48.2		

3: Define a class that inherits from the int type and implements: when the incoming parameter is a string, return the sum of the ASCII codes of all characters of the changed string (use ord() to obtain the ASCII code value of a character).

>>> class A(int):
	def __new__(cls,arg):
		if isinstance(arg,str):
			total=0
			for each in arg:
				total+=ord(each)
			arg=total
		return int.__new__(cls,arg)

	
>>> a=A('CARROT')
>>> a
459

4. The addition of two strings will automatically splice strings, and subtraction will throw an exception. Choose to define a class so that when A-B, all substrings with B will be taken from a.

>>> class A(str):
	def __sub__(self,other):
		return self.replace(other,'')

	
>>> a=A('I love carrothhhhhhf')
>>> b=A('hf')
>>> a-b
'I love carrothhhhh'
>>> c=A('h')
>>> a-c
'I love carrotf'
#a. The values of B and C remain unchanged

5. Define a class. When the addition, subtraction, multiplication and division operations occur between the instance objects of this class, the sum of ASCII codes of all strings of this object will be calculated.

class A:
    def __init__(self,arg):
        if isinstance(arg,str):
            self.total=0
            for each in arg:
                self.total+=ord(each)

        else:
            print('Parameter input error')

    def __add__(self,other):
        return self.total+other.total
    def __sub__(self,other):
        return self.total-other.total
    def __mul__(self,other):
        return self.total*other.total
    def __truediv__(self,other):
        return self.total/other.total
    def __floordiv__(self,other):
        return self.total//other.total
>>> print(a1+a2)
945
>>> print(a1*a2)
191394
>>> print(a1-a2)
-357
>>> print(a1/a2)
0.45161290322580644
>>> print(a1//a2)
0

6. Use shift operators

>>> class A(str):
	def __lshift__(self,other):
		return self[other:]+self[:other]
	def __rshift__(self,other):
		return self[-other:]+self[:-other]

	
>>> a=A('I love carrot')
>>> a<<3
'ove carrotI l'
>>> a>>3
'rotI love car'

Tags: Python

Posted by TheSaint97 on Tue, 19 Apr 2022 12:33:39 +0930