- class Student(object): #class 后面紧接着是类名, 即 Student, 类名通常是大写开头的单词, 紧接着是(object), 表示该类是从哪个类继承下来的. 通常, 如果没有合适的继承类, 就使用 object 类, 这是所有类最终都会继承的类.
- def __init__(self,name,score): #通过定义一个特殊的__init__方法, 在创建实例的时候, 就把类的 name,score 等属性绑上去,__init__方法的第一个参数永远是 self, 表示创建的实例本身, 因此, 在__init__方法内部, 就可以把各种属性绑定到 self, 因为 self 就指向创建的实例本身, 除了 self 外, 其他参数和函数的参数一致, 仍然可以用默认参数, 可变参数, 关键字参数和命名关键字参数.
- self.name = name
- self.score = score
- def print_score(self): #在 Student 类的内部定义访问数据的函数, 这样, 就把 "数据" 给封装起来了. 这些封装数据的函数是和 Student 类本身是关联起来的, 我们称之为类的方法, 要定义一个方法, 除了第一个参数是 self 外, 其他和普通函数一样. 要调用一个方法, 只需要在实例变量上直接调用, 除了 self 不用传递, 其他参数正常传入.
- print("%s:%s" % (self.name,self.score))
- def get_grade(self): #封装的另一个好处是可以给 Student 类增加新的方法, 比如 get_grade, 同样的, get_grade 方法可以直接在实例变量上调用, 不需要知道内部实现细节
- if self.score>= 90:
- return "A"
- elif self.score>= 60:
- return "B"
- else:
- return "C"
- bar = Student("Bart Simpson",59)
- bar.print_score()
- ret = bar.get_grade()
- print(ret)
- lisa = Student("Lisa Simpson",87)
- lisa.age = 18
- print(dir(lisa)) #使用 dir()来查看类 (或者是变量) 可以使用的方法, 可以看到 Lisa 实例比 bar 实例多了个 age 方法, 这是因为我们的 lisa.age = 18 语句给 lisa 添加了新属性 age. 和静态语言不同, Python 允许对实例变量绑定任何数据, 也就是说, 对于两个实例变量, 虽然它们都是同一个类的不同实例, 但拥有的变量名称都可能不同.
- #['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'get_grade', 'name', 'print_score', 'score']
- print(dir(bar))
- #['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'get_grade', 'name', 'print_score', 'score']
- #******************************************** 访问限制 **********************************
- # 在 Python 中, 变量名类似__xxx__的, 也就是以双下划线开头, 并且以双下划线结尾的, 是特殊变量, 特殊变量是可以直接访问的, 不是 private 变量
- # 有时候会看到单下划线开头的变量, 比如_name, 这样的实例变量外部是可以访问的, 但是, 按照约定俗成的规定, 当你看到这样的变量时, 意思就是,"虽然我可以被访问, 但是, 请把我视为私有变量, 不要随意访问"
- # 双下划线开头的实例变量一般是不能直接从外部访问的, 但是也不是一定不能从外部访问呢. 不能直接访问__name 是因为 Python 解释器对外把__name 变量改成了_Student__name, 所以, 仍然可以通过_Student__name 来访问__name 变量, 但是强烈建议你不要这么干, 因为不同版本的 Python 解释器可能会把__name 改成不同的变量名
- 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 set_score(self, score): #通过内部方法来在类内部修改__score #在方法中, 可以对参数做检查, 避免传入无效的参数:
- if 0 <= score <= 100:
- self.__score = score
- else:
- raise ValueError('bad score')
- bart = Student("Bart simpson",59)
- bart.print_score()
- #Bart simpson:59
- bart.set_score(89)
- bart.print_score()
- #Bart simpson:89
来源: http://www.bubuko.com/infodetail-2650877.html