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

    python中初始化实例属性

    虽然我们可以自由地给一个实例绑定各种属性,但是,现实世界中,一种类型的实例应该拥有相同名字的属性。

    普通例子:

    class Person(object):
        def __init__(self, name, gender, birth):
            self.name = name
            self.gender = gender
            self.birth = birth

    __init__() 方法的第一个参数必须是 self(也可以用别的名字,但建议使用习惯用法),后续参数则可以自由指定,和定义函数没有任何区别。

    相应地,创建实例时,就必须要提供除 self 以外的参数:

    xiaoming = Person('Xiao Ming', 'Male', '1991-1-1')
    xiaohong = Person('Xiao Hong', 'Female', '1992-2-2')

    例子:

    定义Person类的__init__方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例。

    class Person(object):
        def __init__(self,name,gender,birth,**kw):
            self.name = name
            self.gender = gender
            self.birth = birth
            for k, v in kw.items():
                setattr(self, k, v)
    
    xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student')
    
    print xiaoming.name
    print xiaoming.job

    解释器内部会将**kw拆分成对应的dict.
    setattr()方法接受3个参数:setattr(对象,属性,属性的值)
    setattr(self,k,v)相当于self.k = v
    kw.iteritems()历遍字典kw的所有key和value,分别匹配k,v

    *args和*kw知识请看  http://www.cnblogs.com/bahcelor/p/6872456.html

    类是模板,而实例则是根据类创建的对象

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

    class Person(object):
        address = 'Earth'   #定义类属性
        def __init__(self, name):
            self.name = name

    所有实例都可以访问到它所属的类的属性

    p1 = Person('Bob')
    p2 = Person('Alice')
    print p1.address
    # => Earth
    print p2.address
    # => Earth

    由于Python是动态语言,类属性也是可以动态添加和修改的:

    Person.address = 'China'
    print p1.address
    # => 'China'
    print p2.address
    # => 'China'

    因为类属性只有一份,所以,当Person类的address改变时,所有实例访问到的类属性都改变了。

    例子:

    class Person(object):
        count = 0
        def __init__(self,name):
            self.name = name
            Person.count = Person.count+1
    
    p1 = Person('Bob')
    print Person.count
    
    p2 = Person('Alice')
    print Person.count
    
    p3 = Person('Tim')
    print Person.count

    当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。

    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
    
    #结果如下
    Person.address = Earth
    p1.address = China
    Person.address = Earth
    p2.address = Earth

    当我们把 p1 的 address 实例属性删除后,访问 p1.address 就又返回类属性的值 'Earth'了:

    del p1.address
    print p1.address
    # => Earth

    实例上修改类属性,它实际上并没有修改类属性,而是给实例绑定了一个实例属性。

    一个实例的私有属性就是以__开头的属性,无法被外部访问。虽然私有属性无法从外部访问,但是,从类的内部是可以访问的。除了可以定义实例的属性外,还可以定义实例的方法

    class Person(object):
    
        def __init__(self, name):
            self.__name = name
    
        def get_name(self):
            return self.__name
    p1 = Person('Bob')
    print p1.get_name()  # self不需要显式传入
    # => Bob

    在实例方法内部,可以访问所有实例属性,这样,如果外部需要访问私有属性,可以通过方法调用获得,这种数据封装的形式除了能保护内部数据一致性外,还可以简化外部调用的难度。

    python中定义类方法

    在class中定义的全部是实例方法,实例方法第一个参数 self 是实例本身。

    要在class中定义类方法,需要这么写:

    class Person(object):
        count = 0
        @classmethod
        def how_many(cls):
            return cls.count
        def __init__(self, name):
            self.name = name
            Person.count = Person.count + 1
    
    print Person.how_many()
    p1 = Person('Bob')
    print Person.how_many()
    #输出
    0
    1

    通过标记一个 @classmethod,该方法将绑定到 Person 类上,而非类的实例。类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.count 实际上相当于 Person.count。

    因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用。

  • 相关阅读:
    Cobbler学习之一--Fedora17下配置Cobbler安装环境
    linux下 tar解压 gz解压 bz2等各种解压文件使用方法
    linux性能检测工具
    firefox的plugin-container进程关闭方法
    部署额外域控制器,Active Directory
    利用yum下载软件包的三种方法
    HP iLo2 试用序列号
    (转)Linux下root密码丢失和运行级别错误的解决办法
    linux下的5个查找命令
    (转)CentOs上配置samba服务
  • 原文地址:https://www.cnblogs.com/dear_diary/p/6872243.html
Copyright © 2011-2022 走看看