在类的变量前面加 _ _ 是私有变量,外部不可访问。
需要注意的是,在Python中,变量名类似__xxx__
的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__
、__score__
这样的变量名。
# coding=utf8 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)) bart = Student('Bart Simpson', 98) print(bart.__name)
示例二:
# coding=utf8 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)) # 让外部获取name和score def get_name(self): return self.__name def get_score(self): return self.__score # 设置分数 def set_score(self, score): if 0 <= score <= 100: self.__score = score else: raise ValueError('bad score') bart = Student('Bart Simpson', 98) print(bart.get_name()) print(bart.get_score()) bart.set_score(80) print(bart.get_score()) # print(bart.set_score('str'))
Python内置的@property装饰器就是负责把一个方法变成属性调用的
# coding=utf8 class Student(object): @property def birth(self): return self._bith @birth.setter def birth(self, value): self._birth = value @property def age(self): return 2015 - self._birth s = Student() s.birth = 1980 print(s.age)
多重继承
# coding=utf8 class Animal(object): pass # 大类 class Mammal(Animal): pass class Bird(Animal): pass # 各种功能 class Runnable(object): def run(self): print('Running...') class Flyable(object): def fly(self): print('Flying...') # 各种动物 class Dog(Mammal, Runnable): pass class Bat(Mammal, Flyable): pass class Parrot(Bird, Flyable): pass class Ostrich(Bird, Runnable): pass
定制类
# coding=utf8 class Student(object): def __init__(self, name): self.name = name def __str__(self): return 'Student object (name: %s)' % self.name print(Student('Michael')) 另一个实例: # coding=utf8 class Student(object): def __init__(self): self.name = 'Michael' def __getattr__(self, attr): if attr == 'score': return 99 raise AttributeError('\'Student\' object has no attribute \'%s\'' % attr) s = Student() print(s.name) print(s.score)
直接对实例进行调用
# coding=utf8 # 直接对实例进行调用 class Student(object): def __init__(self, name): self.name = name def __call__(self): print('My name is %s.' % self.name) s = Student('Michael') s()
枚举类
# coding=utf8 from enum import Enum Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')) for name, member in Month.__members__.items(): print(name, '=>', member, ',', member.value)
结果: