- 类的属性有字段和方法两种,字段是属于对象或者类的变量,方法是属于类的函数。
- self关键字,self是区分类函数和普通函数的一个特征,类函数即使不用传入参数也必须带有self参数,self相当于c#中的this关键字,它代表当前对象,并可以把当前对象传入类函数中。
- 类变量和对象变量
class Robot: population=0#类变量 def __init__(self,name): self.name=name print("(Initializing{}).format(self.name)") Robot.population+=1 def die(self): print("{} is being destroyed!".format(self.name)) Robot.population-=1 def sayHi(self): print("Greetings, my masters call me{}".format(self.name)) @classmethod def howMany(cls): print("we have {:d} robots".format(cls.population)
其中Robot.population为类变量,任何类的实例将类变量的值改变那么在其他实例中改类变量的值也会相应的改变,self.name为对象变量,每个实例拥有自己的对象变量其值改版不影响其他实例中的同名变量。如果对象变量和类变量同名,那么被实例调用时只会显示对象变量,类变量被隐藏。@classmethod是一个装饰器,其为一个包装器函数的快捷方式,效果等价于howMany=classmethod(howMany)。
-
访问限制
class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def print_score(self): print('%s: %s' % (self.__name, self.__score)) def get_name(self): return self.__name def set_score(self, score): self.__score = score
在对象变量前加双下划线__可以将其变为私有变量,以__name为例原理是python使用了名称调整使其名称变为_Student__name(不同版本的python可能改为不同的名称),因此无法用对象.__name来访问。如果需要获取__name的值或改变它的值需要通过上述函数来实现。其他未加__的变量都是公开的变量,可以为其他任何类或对象使用。按照约定俗成的规定,以一个下划线开头的实例变量名,比如
_name
,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。此外,变量名类似__xxx__
的变量是特殊变量,它可以被外部直接访问。 -
继承和多态
class SchoolMember: def __init__(self, name, age): self.name = name self.age = age print('(Initialized SchoolMember: {})'.format(self.name)) def tell(self): print('Name:"{}" Age:"{}"'.format(self.name, self.age), end=" ") class Teacher(SchoolMember): def __init__(self, name, age, salary): SchoolMember.__init__(self, name, age) self.salary = salary print('(Initialized Teacher: {})'.format(self.name)) def tell(self): SchoolMember.tell(self) print('Salary: "{:d}"'.format(self.salary)) class Student(SchoolMember): def __init__(self, name, age, marks): SchoolMember.__init__(self, name, age) self.marks = marks print('(Initialized Student: {})'.format(self.name)) def tell(self): SchoolMember.tell(self) print('Marks: "{:d}"'.format(self.marks))
如果子类中没有__init__函数,那么会调用其父类中的__init__函数,如果有则用子类中自带的__init__函数。由此可见子类中存在于父类同名的函数,那么父类的函数会被隐藏,只调用子类的函数。一个有多个父类的子类叫多重继承。多态就是如果一个函数的参数是SchoolMember类,但是我们把Teacher类当做参数传入其中,因为Teacher类是SchoolMember类的子类,函数会像对待SchoolMember类一样对Teacher类进行相应的操作,例如这个函数中调用tell方法打印SchoolMember类的信息,那么如果参数是Teacher类,则会调用Teacher类中的tell方法,若Teacher类没有该方法就调用其父类也就是SchoolMember类的tell方法。
-
获取对象信息
type(123)#int a = Animal() d = Dog() h = Husky() isinstance(h, Animal)#true isinstance(dog,Animal)#true isinstance(h, Husky)#true isinstance(d, Husky)#false isinstance('a', str)#true dir('ABC')
type函数返回参数的类型,如上述代码返回123的类型为int;isinstance函数判断第一个参数是否为第二个参数的子类或者实例,可以看出子类相当于是父类的实例;dir函数可以返回参数所有的方法和字段,如上述代码可以返回str类型所有的方法和字段。