Problem with return super().__getattribute__(attr) blender 2.8 That script make this problem:
 return super().getattribute(attr)
AttributeError: 'ParticleSystem' object has no attribute 'my_particle_settings'
i think is a good solution , about create a particle system with default setting, but not work. 
i think , i create another function ? is a good o bad way?

import bpy
from bpy.props import  BoolProperty, PointerProperty
from bpy.types import PropertyGroup, Panel, Object

def emitter_update(self, context):

    toogle = self.my_particle_settings.emitter_hair
    part = self.particle_systems[0]  
    settings = part.settings
    settings.type = 'EMITTER' if toogle else 'HAIR'

class MyParticleSettings(bpy.types.PropertyGroup):       
    emitter_hair: BoolProperty(update = emitter_update)

class ParticleSystem(bpy.types.Operator):


    bl_idname = "object.particlesystem"
    bl_label = "Why"

    def execute(self,context):



        part_system = bpy.context.active_object
        part_system.modifiers.new('New Part sys', type='PARTICLE_SYSTEM')
        emitter_update(self, context)

        return{'FINISHED'}


class VIEW3D_PT_toggle_ps(Panel):
    """Test"""

    bl_label = "My Panel"
    bl_space_type = "VIEW_3D"
    bl_region_type = "UI"
    bl_category = "View"

    def draw(self, context):
        ob = context.object
        layout = self.layout

        layout.label(text="My new problem:")
        row = layout.row()
        row.scale_y = 1
        row.operator("object.particlesystem", text='Click')
        layout.prop(ob.my_particle_settings, 'emitter_hair',  text="Toggle")


classes = (MyParticleSettings,
        VIEW3D_PT_toggle_ps,ParticleSystem)  


def register():
    for cls in classes:       
        bpy.utils.register_class(cls)

    Object.my_particle_settings = PointerProperty(type=MyParticleSettings)


def unregister():
    for cls in reversed(classes):       
        bpy.utils.unregister_class(cls)

if __name__ == "__main__":
    register()
Knowing one's self

You have called the following 

emitter_update(self, context)


from the operator, where self is the operator instance passed as the self argument to the execute(self, context) method. Operators have no particle systems 8^). The update method expects self to be an Object type which has a particle settings attribute.

From within the operator use

emitter_update(context.object, context)