封装,绑定方法与非绑定方法

一:封装

           1,什么是封装:

                   封:属性对外是隐藏的,但对内是开放的

                   装:申请一个名称空间,往里面填入一系列名字/属性

            2,为什么要封装?

            封装数据属性的目的

                    首先定义属性的目的就是为了给类外部的使用的,隐藏之后是为了不让外部直接使用,需要类内部开辟一个接口。然后让类外部的使用通过接口来间接地操作隐藏的属性。

                      精髓在于:我们可以在接口之上附加任意逻辑,从而严格控制使用者对属性的操作

             封装函数的属性

                      首先定义函数的目的就是为了让类的外部使用的    ,隐藏函数属性是为了不让外部直接使用,需要类内部开辟一个接口,然后在接口内去调用隐藏的功能

                        精髓在于:隔离了复杂度

             3,如何隐藏属性?

                       在属性钱加上__(双下划线)开头

                       1,这种隐藏仅仅只是一种语法上的变形操作

                       2,这种语法上的变形只是在定义阶段发生一次,因为类体代码仅仅只是在定义阶段检测一次

                       3,这种隐藏是对外不对内的,即在类的内部的可以直接访问,而在类的外部则无法直接访问。原因是:在类的定义阶段,类体内的代码统一发生了一次形变

                       4,如果不想让子类 的方法覆盖父类的,可以将该方法名前面加一个__开头

                        # class People:
                        #     __country='China' #_People__country='China'#发生变形
                        #     __n=100 #_People__n=100
                        #     def __init__(self,name,age,sex):
                        #         self.__name=name #self._People__name=name
                        #         self.age=age
                        #         self.sex=sex
                        #     def eat(self):
                        #         print('eat.....')
                        #         print(People.__country) #People._People__country#变形
                        #         print(self.__name) #self._People__name#变形
                        # People.eat(123)
                        # print(People.__country)
                        # peo1=People('egon',18,'male')
                        # peo1.eat()
                        # print(peo1.__name)
                        # print(People.__dict__)
                        # print(People.__country)
                        # print(People._People__country)
                        # People.__x=11

                        # print(People.__dict__)

                        # peo1=People('egon',18,'male')
                        # print(peo1.__dict__)
                        # peo1.__x=111

                        # print(peo1.__dict__)

二:绑定方法?

         1,绑定方法:

                特性:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数自动传入

                           精髓在于自动传值

                绑定方法分为两类:

                         1.1 绑定给对象方法:在类内部定义的函数(没有内任何装饰器修饰的  ),默认就是绑定给对象用的。

                          1.2 绑定给类的方法:

                                  在类内部定义的函数如果被装饰器@classmethod装饰,那么则是绑定给类的,应该由类来调用,类来调用就自动将类当作第一个参数自动传入。

              2   非绑定方法:类中定义的函数如果被装饰器@staticmethod装饰,那么该函数就变成了非绑定方法,既不与类绑定,又不与对象绑定,意味着类与对象都可以来调用,但是无论谁来调用,都没有任何自动传值的效果,就是一个普通的函数

               3,应用

                       如果函数体代码需要用外部传入的类,则应该将该函数定义成绑定给类的方法

                      如果函数体代码需要用外部传入的对象,则应该将该函数定义成绑定给对象的方法

                      如果函数体代码既不需要外部传入的参数,也不需要外部传入的对象,则应该将该函数定义成非绑定方法/普通函数。

                # class Foo:
                #     @classmethod
                #     def f1(cls):
                #         print(cls)
                #     def f2(self):
                #         print(self)
                # obj=Foo()
                # print(obj.f2)
                # print(Foo.f1)
                # Foo.f1()
                # print(Foo)
                #1、f1绑定给类的
                # 了解:绑定给类的应该由类来调用,但对象其实也可以使用,只不过自动传入的仍然是类
                # print(Foo.f1)
                # print(obj.f1)
                # Foo.f1()
                # obj.f1()
                #2、f2是绑定给对象的
                # obj.f2()

                # Foo.f2(obj)


              绑定类方法,绑定对象方法,非绑定方法

                import settings
                import uuid
                class Mysql:
                    def __init__(self,ip,port):
                        self.uid=self.create_uid()
                        self.ip=ip
                        self.port=port
                    def tell_info(self):
                        print('%s:%s' %(self.ip,self.port))
                    @classmethod
                    def from_conf(cls):
                        return cls(settings.IP, settings.PORT)
                    @staticmethod
                    def func(x,y):
                        print('不与任何人绑定')
                    @staticmethod
                    def create_uid():
                        return uuid.uuid1()
                # 默认的实例化方式:类名(..)
                obj=Mysql('10.10.0.9',3307)
                # 一种新的实例化方式:从配置文件中读取配置完成实例化
                # obj1=Mysql.from_conf()
                # obj1.tell_info()
                # obj.func(1,2)
                # Mysql.func(3,4)
                # print(obj.func)
                # print(Mysql.func)
                print(obj.uid)        

                       

                    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过自定义组件的 props 和 events 实现封装双向绑定组件。以下是一个简单的示例: ```html <template> <div> <label>{{ label }}</label> <input type="text" :value="value" @input="$emit('input', $event.target.value)"> </div> </template> <script> export default { props: { value: { type: String, default: '' }, label: { type: String, default: '' } } } </script> ``` 在上面的代码中,我们定义了一个包含输入框和标签的自定义组件。该组件接受两个 props:value 和 label。value 表示输入框的值,label 表示标签的文本。在组件内部,我们使用 v-bind 指令将 value 绑定到输入框的 value 属性上,使用 v-on 指令监听输入框的 input 事件,并使用 $emit 方法触发一个名为 input 的自定义事件,并将输入框的值作为参数传递给父组件。 在父组件中,我们可以像使用普通的 input 元素一样使用我们自定义的双向绑定组件: ```html <template> <div> <my-input v-model="name" label="姓名"></my-input> <p>您输入的姓名是:{{ name }}</p> </div> </template> <script> import MyInput from './MyInput.vue' export default { components: { MyInput }, data () { return { name: '' } } } </script> ``` 在上面的代码中,我们使用 v-model 指令将父组件的 name 数据属性与 MyInput 组件的 value 属性进行双向绑定。这样,当用户在 MyInput 组件中输入姓名时,父组件的 name 数据属性也会随之更新,从而实现了双向绑定

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值