python (programación orientada a objetos)

python (programación orientada a objetos)

Combine su propio conferenciante y escriba sus propias notas. Hay deficiencias y espero que puedan comentar las deficiencias. Todos aprenden unos de otros. Bienvenido a dejar un mensaje.

La aparición de
un grupo orientado a objetos con los mismos atributos completa una gran tarea.
Después de crear una instancia y definir la clase, use esta clase para construir un objeto (el objeto puede ser muchos
init (self) [constructor]
self se refiere al objeto instanciado actual
python no es un constructor real, solo una devolución de llamada de la instancia, no puede ser devuelto)
# Definir una clase
clase A (objeto): # definir clase, la primera letra del nombre está en mayúscula, el valor predeterminado () es la clase padre #
construcción del objeto (los atributos incluyen datos y métodos)
pasar

> class P():
>     def __init__(self):
>         print('+'*20)
> 
>     def __init__(self,name,age):
>         self.name=name
>         self.age=age
>         
>     def run(self):
>         pass 
> 
> if __name__=='__main__':
>     p=P()#实例化
>     #p2=P('xxx',20)

Los métodos y funciones son métodos en diferentes clases y funciones fuera de las instancias.
Características del lenguaje dinámico Python
#define una clase
clase P (objeto): #define una clase, la primera letra del nombre está en mayúscula, el valor predeterminado () es la clase principal #
construcción del objeto (los atributos incluyen datos y métodos)
pasa
si nombre = = ' principal ':
p = P ()
p.name = 'nombre'
p.age = 10

print(p.name )
print(p.age )
print(hasattr(p,'name') )#hasatter作用在p上查找name属性
print(hasattr(p,'age') )

p.func=lambda x: x+1
print(p.func (1)) 

Objeto llamada instanciación, llamada instanciación # define
una clase de
la clase A (objeto): # define una clase, el nombre se escribe con mayúscula, y el valor predeterminado () es la clase padre
#Object construcción (atributos incluyen datos y métodos)
pase

class P():


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

    def run(self):
      print(self .name +'run...')

if __name__=='__main__':

    p2=P('xxx',20)#实例化
    print(p2 .age)
    print(p2 .name)

La diferencia entre un tipo de variable y un tipo inmutable
#definir una clase
clase A (objeto): # definir una clase, el nombre está en mayúscula y el valor predeterminado () es la clase principal
# construcción del objeto (los atributos incluyen datos y métodos)
pasar

class P():
    has_two_eyes=[]#定义静态的属性
    #def func(self):
     #   print('func invoke...')

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

    def run(self):
      print(self .name +'run...')

if __name__=='__main__':
   p1=P('p1',1)#实例化对象
   p2=P('p2',2)
  # print(P .has_two_eyes )
   #print(p1.has_two_eyes )
   #print(p2.has_two_eyes )
   ###########################
#P.has_two_eyes +=1#静态属性的更新
#print(P .has_two_eyes )
#########################
#p1 .has_two_eyes +=1
#print(P.has_two_eyes )
#print(p2.has_two_eyes )
#print(p1 .has_two_eyes )
#print(id(P.has_two_eyes ) )
#print(id(p1.has_two_eyes ) )
##########################列表表示.int是不可变,列表是可以改变的类型
p1 .has_two_eyes .append(123)
print(p1 .has_two_eyes )
print(id(P.has_two_eyes ) )
print(id(p1.has_two_eyes ) )

Cómo definir un objeto (diferentes instancias, usar diferentes constructores,)
# definir una
clase Nombre de clase (objeto): # definir clase, nombrar la primera letra en mayúscula, el valor predeterminado () es la clase padre #
construcción del objeto (los atributos incluyen datos y Método (fuera del constructor llamado función))
def init (self, nombre, edad): #constructor (método especial) agregar atributos: nombre, edad (self es el objeto actual this)
self.name = nombre #construir atributos (como el molde de la taza)
self.age = age

def __del__(self):#类的属性都一样(就是对象有相同的属性:如吃) 
    print(self .__class__.__name__+'name del') 
def eat(self):
    print(self .__class__ .__name__+'eat')
def move(self):
    print(self .__class__ .__name__ +'move') 

Encapsulación (privatización de la propiedad -> proporcionar métodos externos para modificar propiedades) Python no es válido en el módulo, válido en la clase (el "__name" dentro de la clase es un guión bajo simple (atributo privado, accesible), guión bajo doble (atributo privado, Inaccesible) hay guiones bajos antes y después (atributos especiales)

Herencia (las subclases pueden acceder a las propiedades de la clase principal (siempre que la clase principal sea pública)
#definir una clase
1. Python es un mecanismo de implementación de herencia múltiple
2. Si hay métodos con el mismo nombre en varias clases principales, el orden de llamar a los objetos de la clase
python2:
| --- clases de estilo nuevo,
herencia primero en amplitud
| --- clases de estilo antiguo (clases clásicas),
herencia primero en profundidad, solo clases de estilo nuevo en
python3

class Name(object ):#定义类,名称首字母大写,默认()里面为父类
#对象的构建(属性包括数据和方法)
    def __init__(self,name,age): #构造器构建实例(特殊方法)添加属性:名字,年龄(self为当前对象this)
        self.name=name    #构造属性(如同杯子的模具)
        self.age=age

    def __del__(self):#类的属性都一样(就是对象有相同的属性:如吃)
        print(self .__class__.__name__+'name del')
    def eat(self):
        print(self .__class__ .__name__+'eat')
    def move(self):
        print(self .__class__ .__name__ +'move')
    def sleep(self):
        print(self .__class__ .__name__ +'sleep')


class Person(Name ):#Persin继承Name(继承有属性,但有不同,有区分)
    #非绑定方法
    def __init__(self,name,age,sex):
        Name.__init__(self, name, age)  # 子类调用父类的构造方法
        self .sex=sex#多的属性区分父类
    def think(self):
        print(self .__class__ .__name__ +'think')
    def wear(self):
        print(self.__class__.__name__ + 'wear')
if __name__=='__main__':
    #a=Name('青蛙',2)#参考定义的构造器规划,实现对象的实例化
    #print('name=%s'%a.name )
    #print('age=%d'%a.age )

    #a.sleep()#aelp不需要传递,解释器自动完成
    #a.eat()
    #a.move()
    b=Person ('人',30,'男')#实例化对象
    print(b.name  )#自己独特的属性
    print(b.age )
    print(b.sex )
    b.eat()#继承的属性
    b.move()
    b.sleep() 

Overwrite | Override ¿Cuál es
la diferencia entre override y overload?
(Sobrecarga: el nombre de la función es el mismo, el tipo o número de parámetro es diferente)

Sobrecarga:
no hay sobrecarga en la función python

Polimorfismo y herencia # definir
una clase
clase P (objeto): # definir una clase, la primera letra del nombre está en mayúscula, el valor predeterminado () es la clase padre
# construcción del objeto (los atributos incluyen datos y métodos)

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

   def run(self):
        print('P run...')

class C(P):
    def __init__(self,name,age,sex):
        P.__init__(self ,name,age )#传递父类的构造
        self. sex=sex

    def run(self):
        P.run(self ) #子类方法体调用父类方法
        print('C run...')#方法的覆盖
if __name__=='__main__':
  c=C('child',20,'man')

c.run () # Binding es la clase instanciada, y ninguna subclase puede llamar a la clase padre. Si la clase secundaria lo tiene, no llamará a la clase principal (polimorfismo)

dir () ver atributos de clase

class A():
    '''
    this is a class
    '''
    def __init__(self):
        pass

if __name__=='__main__':
    for item in dir(A ):#将A放出来
        print(str (item )+str (getattr(A,item ) ) ) #

Ver propiedades de objetos de clase

class A():
    '''
    this is a class
    '''
    def __init__(self,name):
        self .name=name

if __name__=='__main__':
    a=A('name')
    #print(dir(a ) )#查看类的属性和对象
    print(a .__dict__ )#查看对象属性
   

Cuando la subclase no tiene método, se llama a la clase padre

class P():
    #父类实现构造方法,实例化子类对象时会,调用父类的方法
   


 def __init__(self):
        print('p__e')

class A(P ):
    pass


if __name__=='__main__':
    a=A()
    

python父类如果实现了构造方法,子类没有,实例化子类对象时会默认调用父类的构造方法


```clike
class P():
 
    def __init__(self):
        print('P __init__ invoke...')
 
class A(P):
 
    def __init__(self):
        P.__init__(self)
        print('A __init__ invoke...')


 
 
if __name__ == '__main__':
    a=A()

  • El método principal llama a varios métodos
 
 
class P1():
 
    def __init__(self):
        print('P1 __init__ invoke...')
 
class P2():
 
    def __init__(self):
        print('P2 __init__ invoke...')
 
class A(P1,P2):
 
    def __init__(self):
        P1.__init__(self)
        P2.__init__(self)
        print('A __init__ invoke...')
 
 
if __name__ == '__main__':
    a=A()

El segundo método super (A, self). Init ()

 
 
class P1():
 
    def __init__(self):
        print('P1 __init__ invoke...')
 
class P2():
 
    def __init__(self):
        print('P2 __init__ invoke...')
 
class A(P2,P1):
    def __init__(self):
        P1.__init__(self)
        P2.__init__(self)
        super(A,self).__init__()
        print('A __init__ invoke...')
 
 
if __name__ == '__main__':
    a=A()
 
 
 
+ 静态方式无法访问对象的自身属性变量
 
```python
 
class A():
    method = 1  # 静态属性

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

    def run(self):
        print('run invoke...')

    @staticmethod
    def func(x):
        print('self.name=%s' % x)
        print('func invoke...')

    @classmethod
    def test(cls):
        print('test ...')
        print('method=%d'%A.method )#静态的查找


if __name__ == '__main__':
    # a=A('name')
    # a.run()
    # A.func('liwenbo')
    # A('xxx').func('yyy')
    A.test()

  • Método de sobrecarga str
class A(object):
 
    def __init__(self,name,age):
        self.name=name
        self.age=age
 
    def __str__(self):#方法重载
        return 'name=%s,age=%d'%(self.name,self.age)
 
if __name__ == '__main__':
    a=A('liwen',20)
    print(a)
 
+ 重载__iter__和__next__实现一个可迭代的类型(无限循环的版本)
 

 

import random
 
class A():
 
    def __init__(self,seq):
        '''seq type(iterable)'''
        self.seq=seq
 
    def __iter__(self):
        return self#返回当前对象,变成可迭代的对象
 
    def __next__(self):
        return self.seq[random.randint(0,len(self.seq)-1)]
 
if __name__ == '__main__':
    a=A([1,2,3])
 
    for item in a:
        print(item)
 

Sobrecargue __iter__ y __next__ para implementar un tipo iterable (versión de bucle limitado)

import random
 
class A():
 
    def __init__(self,seq):
        '''seq type(iterable)'''
        self.seq=seq
        self.index=0
 
    def __iter__(self):
        return self#返回当前对象
 
    def __next__(self):
        if self.index > len(self.seq) - 1:
            raise StopIteration
        else:
            tmp = self.seq[self.index]
            self.index+=1
            return tmp
 
if __name__ == '__main__':
    a=A([1,2,3,50,43])
 
    for item in a:
        print(item)
 
 
 
**单链表结构**
 
```python
 
#实现一个单链表
 
#用node来作为链表的节点抽象类

class Node():
 
    def __init__(self,data):
        self.data=data
        self.next=None
 
    def show(self):
        print('node data=%d'%self.data)
 
 
    def __str__(self):
        return 'node data=%s'%self.data
 
class LinkList():
 
    def __init__(self):
        self.head=None
 
    def insertFirst(self,data):
        newNode = Node(data)#创建新节点
        newNode.next=self.head
        self.head = newNode
 
    def deleteFirst(self):
        tmpNode= self.head
        self.head=self.head.next
        return tmpNode
 
    def travel(self):
        currentNode = self.head
        while currentNode is not None:
            print(currentNode)
            currentNode = currentNode.next
 
if __name__ == '__main__':
    n1=Node('A')
    n2=Node('B')
    n3=Node('C')
 
    link=LinkList()
    link.insertFirst(n1)
    link.insertFirst(n2)
    link.insertFirst(n3)
 
    link.travel()
 
    print('+'*30)
 
    link.deleteFirst()
    link.deleteFirst()
    link.deleteFirst()
 
    link.travel()

La subclase anula la clase principal para cambiar el comportamiento predeterminado de la clase principal

class Mr(dict ):#子类覆盖父类方法
    def keys(self):
        return sorted(super(Mr,self).keys(),reverse=False)#super父类方法调用

if __name__=='__main__':
        w=Mr({'a':1,'b':2})
        print(w.keys()) 

La clase secundaria hereda la clase principal inmutable (para cambiar el comportamiento inmutable de la clase principal)

class WrapperFloat(float):#改变父类不可变变量,保留小数点后二位。
    def __init__(self,val):#禁止返回return
        self.val=val
        print('__init__')
      

    def __new__(cls,val):
        #return float.__new__(cls,round(val,2))
        return super(WrapperFloat, cls ).__new__(cls,round(val,2))#方法2
if __name__=='__main__':
    w=WrapperFloat(3.0098)
    print(w )
    

Aplicación de slots de la clase (atributo de protección)

class A():
    __slots__ = 'name','age'#定义了类的属性名称,不允许增加和修改

    def __init__(self,name):
        self.name=name
if __name__=='__main__':
    a=A('li')
    a.app()

Supongo que te gusta

Origin blog.csdn.net/weixin_47514459/article/details/109890624
Recomendado
Clasificación