28-- ejemplos de aprendizaje para explicar el paquete orientado a objetos Python

ejemplos orientados a objetos para explicar

clase escolar: 
    school_name = ' Oldboy ' 

    def  __init__ (auto, apodo, dir): 
        self.nickname = apodo 
        self.addr = addr 
        self.classes = [] 

    def related_class (auto, class_obj):
         # self.classes.append (班级名字) 
        # self.classes.append (class_name) 
        self.classes.append (class_obj) 

    def tell_class (self): # 
        # 打印的班级的名字
        de impresión (self.nickname.center (60, ' = '))
         # Imprimir la información de golf de clase 
        para CLASS_OBJ en self.classes: 
            class_obj.tell_course () 


# # a: Escuela 
# # 1, crear un campus 
school_obj1 = Escuela ( ' el niño de la escuela mágica ' , ' Shanghai ' ) 
school_obj2 = la escuela ( ' old boys Royal Park campus ' , ' Pekín ' )
 # 
# # 2, las clases ofrece la escuela para el 
# # Shanghai campus abierto: 14 a tiempo completo, a tiempo completo campus de Shanghai abrió 15 
# school_obj1.related_class ( "a tiempo completo de 14" ) 
# school_obj1.related_class ( "a tiempo completo de 15") 
# 
## Beijing campus abierto: a tiempo completo 29 
# school_obj2.related_class ( "a tiempo completo 29") 
# 
# # 3, ver cada campus clase abierta 
# school_obj1.tell_class () 
# school_obj2.tell_class () 


de clase Clase:
     DEF  __init__ ( Ser, nombre): 
        el self.name = nombre 
        self.course = Ninguno 

    DEF related_course (auto, course_obj):
         # self.course = COURSE_NAME 
        self.course = course_obj 

    DEF tell_course (Ser):
         Imprimir ( ' % S ' % del self.name , End = " " ) 
        Self.course.tell_info) ( # detalles del programa de impresión 

# Dos: Clase 
# 1, crear una clase 
class_obj1 = Clase ( ' a tiempo completo 14 ' ) 
class_obj2 = Clase ( ' a tiempo completo 15 ' ) 
class_obj3 = Clase ( ' a tiempo completo 29 ' ) 

# 2, un programa asociado para la clase 
# class_obj1.related_course (' Python desarrollo full-stack ') 
# class_obj2.related_course (' operación Linux y mantenimiento ') 
# class_obj3.related_course (' Python desarrollo full-stack ') 

# 3, Ver la información de golf de clase 
# class_obj1.tell_course () 
#class_obj2.tell_course () 
# class_obj3.tell_course () 

# 4, las clases ofrece la escuela para el 
# Shanghai Campus abierto: 14 a tiempo completo, Shanghai abrió un campus a tiempo completo 15 
school_obj1.related_class (class_obj1) 
school_obj1.related_class (class_obj2) 

# Beijing Campus abierta: a tiempo completo 29 
school_obj2.related_class (class_obj3) 


# school_obj1.tell_class () 
# school_obj2.tell_class () 



de clase Curso ,:
     DEF  __init__ (Ser, nombre, precio periodo ,.): 
        self.name = nombre 
        self.period = periodo 
        Auto .price = precio. 

    DEF tell_info (Ser):
        Imprimir ( ' <nombre del programa: ciclo% s:% s Precio:% s> ' % (self.name, self.period, self.price))
 # III: Curso 
# 1, cree curriculum 
course_obj1 curso, = ( ' Python toda desarrollo pila ' ' 6mons '20000 ) 
course_obj2 = supuesto, ( ' operación y mantenimiento de Linux ' ' 5mons ' , de 18.000 ) 

# detalle 2 Ver cursos 
# course_obj1.tell_info () 
# course_obj2.tell_info () 

# 3, a Asistir a clases asociado 
class_obj1.related_course (course_obj1) 
class_obj2.related_course (course_obj2) 
class_obj3.related_course (course_obj1) 

# class_obj1.tell_course () 
# class_obj2.tell_course () 
# class_obj3.tell_course () 

school_obj1.tell_class () 
school_obj2.tell_class ()

 

Un paquete

La programación orientada a objetos tiene tres características: encapsulación, herencia, polimorfismo, la característica más importante es el paquete. El paquete se refiere a los datos y las funciones están integradas entre sí, no suena muy familiar, sí, hemos dicho antes "integrado", la palabra es en realidad un paquete de argumento popular. Además, para el paquete a un objeto o clase atributos, podemos controlar estrictamente el acceso a ellos, realizado en dos etapas: las interfaces abiertas y ocultas

 

Dos atributo oculto

Python es mecanismos dobles de clase subrayada empleadas en el inicio del atributo oculto manera (dispuestos privado), pero de hecho esto es sólo una variante de funcionamiento, cuando el comienzo de la clase de todas las propiedades son líneas dobles que caen en la detección gramática automática fase de definición de clase se convierte en "_ __ nombre de la clase nombre del atributo" forma:

class Foo:
    __N=0 # 变形为_Foo__N def __init__(self): # 定义函数时,会检测函数语法,所以__开头的属性也会变形 self.__x=10 # 变形为self._Foo__x def __f1(self): # 变形为_Foo__f1 print('__f1 run') def f2(self): # 定义函数时,会检测函数语法,所以__开头的属性也会变形 self.__f1() #变形为self._Foo__f1() print(Foo.__N) # 报错AttributeError:类Foo没有属性__N obj = Foo() print(obbj.__x) # 报错AttributeError:对象obj没有属性__x

 

Este problemas de deformación que la atención necesidad son:

1, en las propiedades fuera de la clase no se puede acceder directamente al comienzo de la decadencia en la línea doble, pero ya se sabe los nombres de las clases y atributos que puede deletrear el nombre: nombre de la clase _ __ propiedad, entonces usted puede visitar, como Foo._A__N, por lo que este no hay límite de acceso externo y operar sobre el terreno en el sentido estricto, sólo una deformación del significado gramatical.

>>> Foo.__dict__
mappingproxy({..., '_Foo__N': 0, ...}) >>> obj.__dict__ {'_Foo__x': 10} >>> Foo._Foo__N 0 >>> obj._Foo__x 10 >>> obj._Foo__N 0

2, dentro del atributo de clase es líneas directamente accesibles dobles que comienzan a disminuir, como self .__ f1 (), ya que una deformación uniforme en la definición de clase en el principio de la doble tipo de fase interna propiedades de línea declive.

>>> obj.f2() __f1 run

3, una vez que la definición de la asignación de clase tras la modificación se produce sólo durante la etapa de la definición de clase, no va a ser deformado.

>>> Foo.__M=100 >>> Foo.__dict__ mappingproxy({..., '__M': 100,...}) >>> Foo.__M 100 >>> obj.__y=20 >>> obj.__dict__ {'__y': 20, '_Foo__x': 10} >>> obj.__y 20

 

Tres interfaces abiertas

Las propiedades personalizadas es de uso, no es el propósito de su escondite

3.1 Datos atributo oculto

La clase de datos oculta limita operación externa directa sobre los datos, entonces la interfaz debe proporcionar clase permitida datos de operación externos indirectos, la interfaz puede estar unido en la lógica adicional para controlar estrictamente la operación de los datos

>>> class Teacher:
... def __init__(self,name,age): #将名字和年纪都隐藏起来 ... self.__name=name ... self.__age=age ... def tell_info(self): #对外提供访问老师信息的接口 ... print('姓名:%s,年龄:%s' %(self.__name,self.__age)) ... def set_info(self,name,age): #对外提供设置老师信息的接口,并附加类型检查的逻辑 ... if not isinstance(name,str): ... raise TypeError('姓名必须是字符串类型') ... if not isinstance(age,int): ... raise TypeError('年龄必须是整型') ... self.__name=name ... self.__age=age ... >>> >>> t=Teacher('lili',18) >>> t.set_info(LiLi','19') # 年龄不为整型,抛出异常 Traceback (most recent call last):  File "<stdin>", line 1, in <module>  File "<stdin>", line 11, in set_info TypeError: 年龄必须是整型 >>> t.set_info('LiLi',19) # 名字为字符串类型,年龄为整形,可以正常设置 >>> t.tell_info() # 查看老师的信息 姓名:LiLi,年龄:19

 

3.2 Funciones propiedad oculta

El propósito es aislar la complejidad, tales como retiros en cajeros automáticos del programa funcional, que cuenta con muchos otros componentes funcionales, tales como tarjetas, autenticación, introduzca la cantidad, impresión de billetes pequeños, retiros, etc., pero para los usuarios que sólo necesitan retiros pueden desarrollar esta interfaz de la función, podemos toda la funcionalidad del resto escondido

>>> class ATM:
... def __card(self): #插卡 ... print('插卡') ... def __auth(self): #身份认证 ... print('用户认证') ... def __input(self): #输入金额 ... print('输入取款金额') ... def __print_bill(self): #打印小票 ... print('打印账单') ... def __take_money(self): #取钱 ... print('取款') ... def withdraw(self): #取款功能 ... self.__card() ... self.__auth() ... self.__input() ... self.__print_bill() ... self.__take_money() ... >>> obj=ATM() >>> obj.withdraw()

 

Resume las interfaces de atributos y abiertos ocultos, la esencia es distinguir claramente entre el interior y el exterior, el interior de la clase puede modificar algo en un paquete sin afectar a la persona que llama externa código, y fuera de la clase sólo para tener una interfaz, siempre y cuando el nombre de la interfaz, los parámetros sin cambios, no importa cómo el diseñador para cambiar el código de aplicación interna, los usuarios no tienen necesidad de cambiar el código. Esto proporciona una buena base para la cooperación, siempre y cuando la interfaz para el mismo acuerdo básico, modificar el código de causa de preocupación.

 

Supongo que te gusta

Origin www.cnblogs.com/heirenxilou/p/12661453.html
Recomendado
Clasificación