zoukankan      html  css  js  c++  java
  • 面向对象

    面向对象

    1)self

    类中的函数第一个参数必须是self, self 是为了指代它所存在的类Class之中。

    比如我们如果有好几个不同的obj被创建成同一个类,

    那么有了self,我们的class Foo就能很好的知道哪个指的是自己,不会乱

    所以说,这个 self 就是个代指。代指了自己所在的class。你可以由 self 点进所指class本身的函数。由此可见,self 本身作为一个代词,并不一定要叫self。你也可以用个其他什么来代替。只不过,必须得是这个类的所有子方法的第一个参数:

    2)访问控制

    如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问

    class Student:

        def __init__(self, name, age):

            self.__name = name

            self.__age = age 

    def detail(self):

            print(self.__name)

            print(self.__age)

    LiLei = Student('LiLei', 12)

    LiLei.__age = 20

    LiLei.detail()

    >> 

    LiLei

    12

    3)一些方法

    dir():

    如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法

    getattr()、setattr()以及hasattr():

    我们可以直接操作一个对象的状态:

    hasattr(obj, 'x') #有木有属性'x'

    setattr(obj, 'y', 19) # 设置一个属性'y'

    getattr(obj, 'y') # 获取属性'y'

    getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404

    4)实例属性和类属性

    实例属性:

    class Student(object):

        def __init__(self, name):

            self.name = name

    s = Student('Bob')

    s.score = 90

    类属性:

    class Student(object):

        name = 'Student'

    s = Student() # 创建实例s

    print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性

    s.name = 'Michael' # 给实例绑定name属性

    print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性

    总结:

    1、实例属性可以通过动态添加,而类属性是在创建类的时候已经添加好了

    2、从上面的例子可以看出,在编写程序的时候,千万不要把实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

  • 相关阅读:
    设计模式7—装饰者模式【结构型】
    设计模式6—命令模式【行为型】
    vue工程类型—vue 多模块、vue多项目集成工程
    设计模式5—迭代器模式【行为型】
    设计模式4—代理模式【结构型】
    设计模式3—策略模式【行为型】
    用户权限管理系统(后台权限管理)
    https原理 及 证书
    设计模式2—单例模式【创建型】
    设计模式1—发布订阅者模式【行为型】
  • 原文地址:https://www.cnblogs.com/yongfuxue/p/10036737.html
Copyright © 2011-2022 走看看