What‘s Class? Blueprint 设计蓝图python
把相同行为的对象概括为类(class),程序员
经过类的封装(encapsulation)隐藏内部细节,函数
经过继承(inheritance)实现类的特化(specialization)和泛化(generalization),学习
经过多态(polymorphism)实现基于对象类型的动态分派设计
class Student(object): # __init__是一个特殊方法用于在建立对象时进行初始化操做 # 经过这个方法咱们能够为学生对象绑定name和age两个属性 def __init__(self, name, age): self.name = name #self.name这个标签指向的是name参数传进来的值,这个参数类是str,也有它本身的id 和 value self.age = age def study(self, course_name): print('%s正在学习%s.' % (type(self.name), course_name)) # PEP 8要求标识符的名字用全小写多个单词用下划线链接 # 可是部分程序员和公司更倾向于使用驼峰命名法(驼峰标识) def watch_movie(self): if self.age < 18: print('%s只能观看《熊出没》.' % self.name) else: print('%s正在观看岛国爱情大电影.' % self.name)
一、self.name这个标签指向的是name参数传进来的值,这个参数类是str,也有它本身的code
def main(): # 建立学生对象并指定姓名和年龄 stu1 = Student('骆昊', 38) #类的实例化过程是否是将stu1标签绑定Student('骆昊', 38)的过程? # 给对象发study消息 stu1.study('Python程序设计')# 使用类的方法 # 给对象发watch_av消息 stu1.watch_movie() stu2 = Student('王大锤', 15) stu2.study('思想品德') stu2.watch_movie() if __name__ == '__main__': main()
访问的可见性(C语言中私有变量的定义已经忘光啦~)对象
在Python中,属性和方法的访问权限只有两种,也就是公开的和私有的,继承
若是但愿属性是私有的,在给属性命名时能够用两个下划线做为开头ci
即python中的属性通常是公开的(可能通常类中不会有私有方法)it
class Test: def __init__(self, foo): self.__foo = foo def __bar(self): print(self.__foo) print('__bar') def main(): test = Test('hello') # AttributeError: 'Test' object has no attribute '__bar' test.__bar() # AttributeError: 'Test' object has no attribute '__foo' print(test.__foo) ------------------------------------------------------------------ ------------------------------------------------------------------ 下方是正确的访问方法,python没有从语法上严格保证私有属性或方法的私密性, 只是给私有的属性和方法换了一个名字来“妨碍”对它们的访问 即test._Test__bar(),在私有方法前__bar()加上_Test类名才能访问 def main(): test = Test('hello') # AttributeError: 'Test' object has no attribute '__bar' test._Test__bar() # AttributeError: 'Test' object has no attribute '__foo' print(test._Test__foo) if __name__ == "__main__": main()
下方是正确的访问方法,python没有从语法上严格保证私有属性或方法的私密性,
只是给私有的属性和方法换了一个名字来“妨碍”对它们的访问
即test._Test__bar(),在私有方法前__bar()加上_Test类名才能访问
单下划线 VS 双下划线
单下划线开头:保护成员,只有类对象和子类对象本身可以访问到这些变量,(以单下划线结尾仅仅是为了区别该名称与关键词)
以单下划线开头的变量和函数被默认是内部函数,
使用from module import *时不会被获取,可是使用import module能够获取。
双下划线:私有成员,只容许类自己访问,子类也不行,编译后会被替换为_class__method
例1
class A(object): def _internal_use(self): pass def __method_name(self): pass def main(): print(dir(A())) if __name__ == "__main__": main() --------------------------------------- --------------------------------------- ['_A__method_name', ..., '_internal_use'] 输出的通过编译后改成了_A__method_name 继承A类在构建一个类B class B(A): def __method_name(self): pass def main(): print(dir(B())) if __name__ == "__main__": main() ---------------------------------------- ---------------------------------------- ['_A__method_name', '_B__method_name', ..., '_internal_use']
双下会被系统更改成_ClassName__method_name
新的子类建立同名的方法或属性也就没有关系了,由于父类的双下划线属性不能继承
特殊的属性__init__,在定义类的过程当中,__init__初始化方法是为了绑定实例化对象后的必需要的属性
class Student(object): def __init__(self, name, score): self.name = name self.score = score
Student()类实例化后必须有name和score属性