Objective
For beginners, Python is really easy to use, after all, dynamic type language, no definition can be used, the type of arbitrary conversion is not too convenient, so Python used to write small scripts, bots and so on, no problem.
However, once used to develop a slightly larger project, such as building a Web application, you will encounter some problems, and generally inexperienced people will fall into some pits. = =...
Keng
First, the pit, the function parameter type is a pit, class and class object this is another hole.
Although it has been understood before with other static type languages (such as C#/java), it is always a bit confusing to change the dynamic type of Python.
Example
Let me use the code to give an example.
First, define two classes, all inheriting from the built-in Exception
classes, stating that the two classes are exception classes.
class Error1(Exception): def__str__(self): return‘error1‘class Error2(Exception): def__init__(self): print(‘error2 init‘) def__str__(self): return‘error2‘
Then define the method for handling the exception:
defobject): print(f‘err:{err.__str__()}‘)defException): print(err)
Then the test code:
try: raise Error1exceptas e: error(e)if1!=2: error(Error2)
Operation Result:
err:error1 File"/home/test.py"<module> error(Error2) File"/home/test.py", line 19, in error print(f‘err:{err.__str__()}‘)TypeErrormissing‘self‘
The first error()
result is nothing wrong, but the second one throws an exception, look at the error message first: TypeError: __str__() missing 1 required positional argument: ‘self‘
, do not provide self
parameters, because this parameter is not Error2
an instance of the class, so naturally there are no self
parameters.
Here should be a little understand, is called error(Error2)
this method, the parameters passed in Error2
is actually Error2
the type itself, not its object, a bit magical, incredibly put a type as a parameter.
How to solve it, very simple, the incoming Error2
object on the line.
The code is as follows:
if1!=2: error(Error2())
Run results
error2 initerr:error2
There is no problem, the above code there is a error2
way not to use it, to try.
error2(Error2)error2(Error2())
Run results
<class‘__main__.Error2‘>error2 initerror2
It can be seen that when used print(Object)
, if it is a type, the returned results are printed only when the type of information is typed, which is the type of the object Object.__str__()
.
After understanding the fact is very simple, but Python has no restrictions on the function parameters, even if the method added type hints
, but also played a hint, will not do real restrictions or implicit conversion, so sometimes the code to write long dizzy brain swelling, it is easy to fall into the dynamic type pit t_t ...
International practice, put pictures:
About
For more interesting actions please follow my public number: Dealiaxy
Each article is included in my blog: blog.deali.cn
Python Pit: Class and Class object type parameter pass and use