认识python中的类的对象和方法
在python中所有的数据(包括数字和字符串)实际上都是对象,同一类型的对象都有相同的类型。我们可以使用type()函数获取关于对象的类型信息。
>>>n=5
>>>type(n)
<type'int'>
>>>s='hi'
>>>type(s)
<type'str'>
>>>t=True
>>>type(t)
<type'bool'>
在上面命令中,将5赋值给n,n的数据类型是int;将字符串’hi’赋值给s,s的数据类型是str;将True赋值给t,t的数据类型是bool,在python中,一个对象的类型由创建该对象的类决定。
在python中,还可以在一个对象上执行操作。操作是由方法定义的。
>>>s="hello"
>>>s1=s.upper()
>>>s1
HELLO
一个对象调用方法的语法是object.method()。如上面命令运行,将hello赋值给s,s的数据类型是str,str类型里有upper()方法,upper()返回大写字母表示的新字符串,然后将返回值赋值给s1。
类的定义
一般,使用 class 语句来创建一个新类,class之后为类的名称(通常首字母大写)并以冒号结尾,
class <类名>:
类属性1
……
类属性n
<方法定义1>
……
<方法定义n>
类的属性
类属性有两种:类属性和实例属性(对象属性)。类属性是在类中方法之外定义的;实例属性是在初始化方法__init__()中定义的,定义时以self为前缀,只能通过对象名访问。
__ init__ ()方法,在创建一个对象时默认被调用,类似Java中构造器。不需要手动调用
__ init__(self)中,默认有1个参数名字为self,必须写。如果在创建对象时传递了2个实参,那么__init__(self)中出了self作为第一个形参外还需要2个形参,例如__init__(self,age,name).第一个self不需要手动传参。
init(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递进去
python中一个类中只能有一个__init__方法,不支持该方法的重载(类似java中构造器的重载)
每一个对象 都有自己 独立的内存空间,保存各自不同的属性
多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用 传递到方法内部
属性的访问权限
类中的属性根据外部对其访问的权限,分为公有属性、保护属性和私有属性。“单下划线”开始的属性叫做保护属性,只有其本身和子类能访问到这些属性。“双下划线”开始的是私有属性,只有该类本身能访问,即使子类也不能访问到这个属性。在python中,私有属性也可以通过“对象名._ 类名__私有属性名”的方式直接访问私有属性。没有以任何下划线开头的属性是公有属性,在任何地方均可以访问该属性。
类中的方法
python类中有三种方法:
1、实例方法
一般用def定义,使用该方法必须通过一个类的实例来访问。至少传递一个参数,一般用self。
2、类方法
在def的前面加上@classmethod,该方法可以通过类名调用。至少传递一个参数,一般用cls。
3、静态方法
在def的前面加上@staticmethod,该方法既可以通过类的实例调用,也可以通过类名调用。参数可以为空。
实例:
#!/usr/local/bin/python3
#coding=utf-8
class A:
member = "hello world"
def __init__(self):
pass
#实例方法
def Print1(self):
print ("##instance method", self.member)
def Print2(abc):#参数换为任意单词
print ("##instance method", abc.member)
@classmethod
def Print3(cls):
print ( "####class method:",cls.member)
@classmethod
def Print4(abc):#参数换为任意单词
print ( "####class method:",abc.member)
@staticmethod
def Print5():
print ("###### static method")
if __name__ == '__main__':
a = A()
a.Print1()
a.Print2()
A.Print3()
A.Print4()
A.Print5()
a.Print5()
运行结果:
##instance method hello world
##instance method hello world
####class method: hello world
####class method: hello world
######static method
######static method