About Class

余生颓废 提交于 2019-11-30 11:24:50

 

What‘s Class? Blueprint 设计蓝图

把相同行为的对象归纳为类(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)


1、self.name这个标签指向的是name参数传进来的值,这个参数类是str,也有它自己的

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中,属性和方法的访问权限只有两种,也就是公开的和私有的,

如果希望属性是私有的,在给属性命名时可以用两个下划线作为开头

即python中的属性一般是公开的(可能一般类中不会有私有方法)

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属性

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!