oucsheep

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

分类:

技术点:

相关文章:

  • 2021-04-19
  • 2021-05-24
  • 2021-11-30
猜你喜欢
  • 2021-11-30
  • 2021-12-10
  • 2021-12-10
  • 2021-11-30
  • 2021-11-30
相关资源
相似解决方案