zoukankan      html  css  js  c++  java
  • Python 类和对象

    1、python中初始化实例属性

    必须在__init__(self,…)方法内(注意:双下划线)初始化实例,第一个参数必须为self。
    如需动态添加属性,可用 **kw
    class Person(object):
        def __init__(self,name,gender,birth,**kw):
            self.name = name
            self.gender = gender
            self.birth = birth
            for k,v in kw.iteritems() :
                setattr(self,k,v)
    xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student')
    print xiaoming.name
    print xiaoming.job

    2、python中访问限制

    Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问。

    如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用"__xxx__"定义。

    以单下划线开头的属性"_xxx"虽然也可以被外部访问,但是,按照习惯,他们不应该被外部访问。

    class Person(object):
        def __init__(self, name):
            self.name = name
            self._title = 'Mr'
            self.__job = 'Student'
    p = Person('Bob')
    print p.name
    # => Bob
    print p._title
    # => Mr
    print p.__job
    # => Error
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Person' object has no attribute '__job'

    3、python中创建类属性

    实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。

    class Person(object):
        address = 'Earth'
        def __init__(self, name):
            self.name = name

    调用 Person.address 即可获得类属性,通过实例对象也可以获得类属性

    class Person(object):
        count = 0
        def __init__(self,name='Smith'):
            Person.count = Person.count + 1
            self.name = name
    
    p1 = Person('Bob')
    print Person.count
    
    p2 = Person('Alice')
    print Person.count
    
    p3 = Person('Tim')
    print Person.count
    
    p4 = Person()
    p5 = Person()
    print Person.count
    注意,python不支持构造函数的重载。但通过设置默认值,调用构造函数时就可以省略参数。
    如 p4 = Person()

    4、python中类属性和实例属性名字冲突怎么办

    在实例中修改类属性,可以吗?
    class Person(object):
        address = 'Earth'
        def __init__(self, name):
            self.name = name
    
    p1 = Person('Bob')
    p2 = Person('Alice')
    
    print 'Person.address = ' + Person.address
    
    p1.address = 'China'
    print 'p1.address = ' + p1.address
    
    print 'Person.address = ' + Person.address
    print 'p2.address = ' + p2.address
    当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。
    类的属性也有访问权限,带双下划线(__xxx)的属性无法从外部访问。
     

    5、python中定义实例方法

    类实例方法的定义在类体中,第一个参数必须是self,调用时无需显示传入。

    class Person(object):
    
        def __init__(self, name):
            self.__name = name
    
        def get_name(self):
            return self.__name
    a = Person("Jim")
    a.get_name()
     

    6、python中方法也是属性

    上节中get_name使用下面方式调用时:
    print p1.get_name
    将返回一个方法,而不是函数返回值
    fun = p1.get_name
    print fun()
    能得到name的值。
    可以动态的把方法绑定到一个对象上去(虽然并不常用):
    import types
    def fn_get_grade(self):
        if self.score >= 80:
            return 'A'
        if self.score >= 60:
            return 'B'
        return 'C'
    
    class Person(object):
        def __init__(self, name, score):
            self.name = name
            self.score = score
    
    p1 = Person('Bob', 90)
    p1.get_grade = types.MethodType(fn_get_grade, p1, Person)
    print p1.get_grade()
    # => A
    p2 = Person('Alice', 65)
    print p2.get_grade()
    # ERROR: AttributeError: 'Person' object has no attribute 'get_grade'
    # 因为p2实例并没有绑定get_grade
     

    7、python中定义类方法

    通过@classmethod语句将方法绑定到Person类上。
    类方法中不用self,使用cls代指类。
    class Person(object):
    
        __count = 0
    
        @classmethod
        def how_many(cls):
            return cls.__count
        def __init__(self,name):
            Person.__count += 1
            self.name = name
    print Person.how_many()
    p1 = Person('Bob')
    print Person.how_many()
     

    参考文献:http://www.imooc.com/code/6172

  • 相关阅读:
    关于虚拟机断电导致的 generating /run/initramfs/rdsosreport.txt 问题优秀解决方案
    centos7 yum 阿里源
    startup.bat脚本启动tomcat时,cmd命令窗口闪现问题及Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 错误解决
    Linux 中 Fish Shell
    卸载mysql
    /bin/bash^M: 坏的解释器: 没有那个文件或目录
    elementUI 文本鼠标移入显示太长
    el-upload 手动上传文件
    vue-element-admin 打包测试环境报错
    vue 分页跳转页面详情,返回记住当前点击第几页
  • 原文地址:https://www.cnblogs.com/oucsheep/p/6711406.html
Copyright © 2011-2022 走看看