Two ways to get started with Python

Keywords: Python encoding

1. Double bottom method

Definition: double down method is a special method. It is a method with special significance provided by the interpreter. Double down method is mainly used by python source code programmers. We try not to use double down method in development, but in-depth study of double down method is more conducive to reading source code.

(1) call: different double methods have different triggering methods.

< 1 > len -- len() trigger

class A(object):

    def __init__(self,name):
        self.name = name
        print("Triggered__init__")

    def __len__(self):     # len() trigger
        print("Walk here")
        return len(self.name)    # Return len ("xqrqwr") str__
        # There must be a return value, and the type of the return value must be integer

a = A("xqrqwr")
print(len(a))

# str
a = "12345"      # An instance of str
lst = [1,2,3,4,4,5,5,5,5] # list is an instance of this class
print(len(a))
print(len(lst))

< 2 > hash - hash() trigger

class A(object):

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __hash__(self):  # hash()
        hash({1,2,345})  # Variable data class, non data type
        return 1
        # There must be a return value. The return value must be of integer type.

a = A("meet",25)
print(hash(a))

< 3 > STR -- print or str() trigger

class A:

    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    def __str__(self):   # print triggers str()
        print(111)
        return f"Full name:{self.name} Age:{self.age} Gender:{self.sex}"
        # There must be a return value of type string


a = A("mee",20,"male")
a1 = A("mee1",200,"Man 1")
str(a)
print(a)
print(a1)


# The following comparison:
a = A("mee",20,"male")
a1 = A("mee2",200,"female")

print(f"Full name:{a.name} Age:{a.age} Gender:{a.sex}")   # "Name: meet age: 20 gender: male"
print(f"Full name:{a1.name} Age:{a1.age} Gender:{a1.sex}")  # "Name: meet2 age: 200 gender: female"

< 4 > PRR -- print or% r trigger

class A:

    def __init__(self):
        pass


    def __repr__(self):   # print trigger% r
        print(1111)
        return "Heaven devil"

    def __str__(self):   # STR priority is higher than repr. If both exist, only execute str.
        return "Xiaoyuan"

a = A()
print("%r"%(a))

< 5 > Call - triggered when an object is called. The object is followed by parentheses, that is, object () or class () ()

class A:

    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):  # call called on object ()__
        print("Walk me")
        print(*args, **kwargs)

a = A()
a()

< 6 > EQ equals

class A(object):

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __eq__(self, other):     #  a == a1
        if self.name == other.name:
            return True
        else:
            return False

a = A("mee",56)
a1 = A("mee",108)

print(a == a1)

< 7 > del construction method, when the object is released in memory, the execution will be triggered automatically.

In general, this method does not need to be defined. Because python is a high-level language, programmers do not need to care about the allocation and release of memory when using it. Because the allocation and release of memory are all performed by the python interpreter class, so the call of destructor is automatically triggered by the interpreter when garbage collection.

class A:
    def __init__(self):
        pass

    def __del__(self):    del trigger
        print("Execute me on delete")

a = A()

import time
time.sleep(5)
del a

a = 1
b = a
a = b
Garbage collection mechanism:
    # 80  5/s
    #Reference count
    #Mark clear
    #Bag recycling bag 1: 10 2/h bag 2: 5/3 4h bag 3: 3 20h

The < 8 > item series can operate instance methods like Dictionaries

dic["key"] = value
del dic["key"]
dic["key"]
class A:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __getitem__(self, item):
        print(self.__dict__)
        print(self.__dict__[item])  # What you get is a dictionary.

    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __delitem__(self, key):
        del self.__dict__[key]

a = A("meet",58)
a["sex"] = "male"
a["sex"]
del a["sex"]
print(a.__dict__)

< 9 > new mode (factory mode)

Single instance mode is a common software design mode. In its core structure, there is only one special class called singleton class. The single instance mode can ensure that there is only one instance of a class in the system and the instance is easy to be accessed by the outside world, so it is convenient to control the number of instances and save system resources. If you want to have only one object of a certain class in the system, the singleton pattern is the best solution.

class A(object):

    def __init__(self,name):  # Initialization
        self.name = name
        print("I am__init__,Go ahead of me.")

    def __new__(cls, *args, **kwargs):
        print("I am__new__,Go ahead of me.")
        return "La La La"

a = A("meet")
print("Who am I?:",a)
class A(object):

    def __init__(self,name):  # Initialization
        self.name = name
        print("I am__init__,Go ahead of me.")

    def __new__(cls, *args, **kwargs):
        obj = object.__new__(A)
        print("Where am i?:",obj)
        return obj                   # obj == __init__()

a = A("meet")
print("Who am I?:",a)
class A(object):

    def __init__(self,name): # Initial knowledge
        self.name = name


    def __new__(cls, *args, **kwargs):
        obj = object.__new__(A)   # The call is "new" in the object class. Only "new" in the object class can create a space.
        return obj   #essence: obj == __init__()     return __init__()  # Trigger init method


a = A("mee")  # a is the memory address of the object
a1 = A("Heaven devil")  # a is the memory address of the object
a2 = A("Tianyang")  # a is the memory address of the object
print(a.name)
print(a1.name)
print(a2.name)
# Execute the new method first and then the init method

class A:
    __a = None  #__a =  0x000001F346079FD0

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __new__(cls, *args, **kwargs):
        if cls.__a is None:
            obj = object.__new__(cls)
            cls.__a = obj
        return cls.__a

a = A("mee",123)  # Address 0x000001F346079FD0
a1 = A("Heaven devil",11)
print(a.name)
print(a1.name)
Singleton mode: no matter how many times it is created, the same memory space is used
Module import, handwritten singleton mode
What happens when an object is instantiated:
Create the object and open up the object space.__
Automatically execute the init method, implicitly passing the object address to self
Encapsulate object properties into object space

2. Context

(1)__ enter__

(2)__ exit__

class my_open:

    def __init__(self,file,mode="r",encoding="utf-8"):
        self.file = file
        self.mode = mode
        self.encoding = encoding

    def __enter__(self):
        self.f = open(self.file,self.mode,encoding=self.encoding)
        return self.f

    def __exit__(self, exc_type, exc_val, exc_tb):
        print(exc_type,exc_val,exc_tb) # When there's no mistake, it's None.
        self.f.close()


with my_open("a.txt") as ffff:
    for i in ffff:
        print(i)
print(ffff.read(1111))
print(ffff.read())

Posted by prakash911 on Mon, 21 Oct 2019 08:38:59 -0700