Python类
Python的类,是定义一个具有相同属性、方法的一个类别。
比如,把汽车这个名词是一个类,我们可以称为汽车类。
汽车的属性可以是有车轮,方向盘等等,可以用来载客,泡妞等的
类可以实例化,实例化的对象则可以拥有这个类的属性和方法,比如,兰博基尼是汽车的一个实例化,所以兰博基尼则有汽车的属性和方法,有轮子,有方向盘等这个类所有的属性,也可以这个类的所有方法,可以用来泡妞,载客。。
我们在python里自定义的一个类,是为了让实例化对象有一样的属性和方法,这样就不需要每次都去写一个语句是实现相同的功能。
在python中,一个对象的特征也称为属性(attribute)。它所具有的行为也称为方法(method)
结论:对象=属性+方法
在python中,把具有相同属性和方法的对象归为一个类(class)
类的私有属性:
__private_attrs两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问
在类内部的方法中使用时self.__private_attrs
类的方法
在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数,self的作用是,一旦该方法被实例化引用,比如A.speak(),speak方法中的self就相当于A这个实例,实际是在告知这个参数是被哪个实例引用了。相当于speak(A)=A.speak()
类定义
#类定义 class people: #定义基本属性 name = ‘‘ age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 #定义构造方法 def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s is speaking: I am %d years old" %(self.name,self.age)) >>>jack = people(‘tom‘,10,30) #创建p实例 >>> jack.speak() #引用speak方法 hello! >>> jack.height=120 #添加height属性 >>> jack.height 120
初始化对象
创建类时,可以定义一个特定的方法,名为__init__(),只要创建这个类的一个实例,就会运行这个方法。可以向__init__()方法传递参数,这样创建对象时就可以把属性设置为你希望的值,__init__()这个方法会在创建对象时完成初始化
类和类继承
1.单继承
class <类名>(父类名) <语句>
eg. class childbook(book) age = 10
2.类的多重继承
class 类名(父类1,父类2,....,父类n) <语句1>
需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索
即方法在子类中未找到时,从左到右查找父类中是否包含方法
class SchoolMember: """Represents any School Member""" def __init__(self, name,age): #关于__init__见下文的__init__解析 self.name = name self.age = age print ‘Initailized SchoolMember: %s‘ %(self.name) def tell(self): ‘‘‘Tell my details.‘‘‘ print ‘Name: %s,Age:%s‘ %(self.name,self.age), class Teacher(SchoolMember): ‘‘‘Represents a Teacher.‘‘‘ def __init__(self,name,age,salary): SchoolMember.__init__(self,name,age) #关于这一句见下文的子类构造器 self.salary = salary print ‘Initailized Teacher: %s‘ %self.name def tell(self): SchoolMember.tell(self) print ‘salary: %d‘ %self.salary class Student(SchoolMember): ‘‘‘Represents a student.‘‘‘ def __init__(self, name, age, marks): SchoolMember.__init__(self, name, age) self.marks = marks print ‘(Initialized Student: %s)‘ % self.name def tell(self): SchoolMember.tell(self) print ‘Marks: "%d"‘ % self.marks t = Teacher(‘Mrs. Shrividya‘, 40, 30000) s = Student(‘Swaroop‘, 22, 75) print # prints a blank line members = [t, s] for member in members: member.tell() # works for both Teachers and Students 运行结果如下: Initailized SchoolMember: Mrs. Shrividya Initailized Teacher: Mrs. Shrividya Initailized SchoolMember: Swaroop (Initialized Student: Swaroop) Name: Mrs. Shrividya,Age:40 salary: 30000 Name: Swaroop,Age:22 Marks: "75"
子类构造器注意点:如果需要,每个子类最好定义它自己的构造器,不然,基类的构造器会被调用(若是子类没有定义构造器,即__Init__方法,则子类在运行的时候,会自动调用基类的构造器)。然而,如果子类重写基类的构造器,基类的构造器就不会被自动调用了--这样,基类的构造器就必须显式写出才会被执行,像我们上面那样,用SchoolMember.__init__(self,name,age)设置名字和年龄。我们的子类在构造器后面几行还设置了另外一个实例属性:薪水salary。
class P(object): def __init__(self): print "calling P‘s constructor" class C(P): def __init__(self): print "calling C‘s constructor" >>> c = C() calling C‘s constructor #如果想调用基类的 __init__(),需要明确指出,使用一个子类的实例去调#用基类(未绑定)方法。相应地更新类C,会出现下面预期的执行结果: class C(P): def __init__(self): P.__init__(self) print "calling C‘s constructor" >>> c = C() calling P‘s constructor calling C‘s constructor
上边的例子中,子类的__init__()方法首先调用了基类的的__init__()方法。这是相当普遍(不是强制)的做法,用来设置初始化基类,然后可以执行子类内部的设置。这个规则之所以有意义的原因是,你希望被继承的类的对象在子类构造器运行前能够很好地被初始化或作好准备工作,因为它(子类)可能需要或设置继承属性。
关于__init__:
class A(object): def __init__(self,name): self.name=name def getName(self): return ‘A ‘+self.name #当执行: a=A(‘hello‘) #相当于: a=object.__new__(A) A.__init__(a,‘hello‘) #即__init__作用是初始化已实例化后的对象