4、put-1-0815b282cdc2> in ()
7 p = Person('Tom')
8 print(p.name)
----> 9 print(p.__job)
AttributeError: Person instance has no attribute '__job'
由此可见,双下划线开头'__job'不能直接被外部访问。
但是问题来了,如果属性以'xxx'形式定义,那它又可以被外部访问。
因为以'xxx'定义的属性在python的类中被称为特殊属性,比如__init__/cmp/str/__int__等等这些都是类预
5、先定义的特殊属性。通常我们不会以这种形式定义属性。
值得说明的是,以单下划线开头的,应该是不能被外部访问的,到底为什么,我也不知道。
为类创建属性
类是模板,而实例是根据类创建的对象。
实例属性每一个实例各自拥有,相互独立,而类属性只有一份。
当类属性和实例属性名字冲突时,优先选择实例属性。
class Person:
job = 'Student'
def __init__(self, name):
self.name = name
# 创建一个Person实例
p1 = Person('Tom')
p2 = Person('Jak
6、')
print(Person.job) # 直接访问类的属性
# 因为python是动态语言,类实质也是个对象,所有类的属性也是可以动态添加和修改的
Person.job = 'Teacher'
print(Person.job)
# 实例属性每一个实例各自拥有,相互独立。
print(p1.name)
print(p2.name)
=>
Student
Teacher
Tom
Jak
因此,实例属性每一个实例各自拥有,相互独立,而类属性只有一份。
定义实例方法
实例的私有属性是由双下划线开头的属性,无法被外部访问,但内部是可以访问的。
实例方法就是在类
7、中定义的函数,它的第一个参数永远是self,指向调用该方法的实例本身。
在实例方法内部,可以访问所有实例属性,如果外部需要访问实例属性,可以通过方法调用获得。
class Person:
def __init__(self, name):
self.__name = name
def get_name(self):
return self.__name
p1 = Person('Tom')
print(p1.get_name())
=>
Tom
万事万物接对象,类和函数都是对象。
p1 = Person('Tom')
8、
print(p1)
print(p1.get_name)
print(p1.get_name())
=>
<__main__.Person instance at 0x000000000BBAD448>
>
Tom
创建类的方法
和属性类似,方法也分实例方法和类方法。
在类中定义的全部是实例方法,实例方法第一个参数self是实例本身。
在在类中定义类的方法,需要在方法上面使用@classmethod
cla
9、ss 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
结语
这只是简单介绍面向对象,如果要深入,多看书。