内容简介:Python day 8(1) 类和实例(2)
一:类和实例
1 面向对象最重要的概念就是类(Class)和实例(Instance),类是抽象的模板。实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
2 在 Python 中,定义类是通过 class
关键字:
class Student(object):
pass
class
后面紧接着是类名,即 Student
,类名通常是大写开头的单词,紧接着是 (object)
,表示该类是从哪个类继承下来的,继承的概念我们后面再讲,通常,如果没有合适的继承类,就使用 object
类,这是所有类最终都会继承的类。
3 定义好了 Student
类,就可以根据 Student
类创建出 Student
的实例,创建实例是通过类名+()实现的: >>> bart = Student()
4 可以自由地给一个实例变量绑定属性,比如,给实例 bart
绑定一个 name
属性: >>> bart.name = 'Bart Simpson'
5 可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的 __init__
方法,在创建实例的时候,就把 name
, score
等属性绑上去:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
注意:特殊方法“__init__”前后分别有两个下划线!!!
6 __init__
方法的第一个参数永远是 self
,表示创建的实例本身,因此,在 __init__
方法内部,就可以把各种属性绑定到 self
,因为 self
就指向创建的实例本身。
有了 __init__
方法,在创建实例的时候,就不能传入空的参数了,必须传入与 __init__
方法匹配的参数,但 self
不需要传,Python解释器自己会把实例变量传进去: >>> bart = Student('Bart Simpson', 59)
7 和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量 self
,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以,仍然可以用默认参数、可变参数、关键字参数和命名关键字参数。
二:数据封装(面向对象编程的一个重要特点)
1 直接在 Student
类的内部定义访问数据的函数,这样,就把“数据”给封装起来了。这些封装数据的函数是和 Student
类本身是关联起来的,我们称之为类的方法。
2 要定义一个方法,除了第一个参数是 self
外,其他和普通函数一样。要调用一个方法,只需要在实例变量上直接调用,除了 self
不用传递,其他参数正常传入。
三:访问限制
1 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。但是外部代码还是可以自由地修改一个实例的属相。
__
,在Python中,实例的变量名如果以 __
开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改:
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
了。这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。
3 如果外部代码要获取内部属性,可以给Student类增加 get_name
和 get_score
这样的方法。
def get_name(self): return self.__name def get_score(self): return self.__score
如果又要允许外部代码修改score怎么办?可以再给Student类增加set_score方法:
def set_score(self, score): self.__score = score4
a 在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量
b 以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
c 双下划线直接开头的实例变量不一定不能被外部访问。不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量。但是不建议这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名。
d
bart = Student('Bart Simpson', 59)
>>> bart.get_name()
'Bart Simpson'
>>> bart.__name = 'New Name' # 设置__name变量!
>>> bart.__name
'New Name'
表面上看,外部代码“成功”地设置了 __name
变量,但实际上这个 __name
变量和class内部的 __name
变量不是一个变量!内部的 __name
变量已经被Python解释器自动改成了 _Student__name
,而外部代码给 bart
新增了一个 __name
变量。不信试试:
>>> bart.get_name() # get_name()内部返回self.__name
'Bart Simpson'
<em id="__mceDel"> </em>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
An Introduction to the Analysis of Algorithms
Robert Sedgewick、Philippe Flajolet / Addison-Wesley Professional / 1995-12-10 / CAD 67.99
This book is a thorough overview of the primary techniques and models used in the mathematical analysis of algorithms. The first half of the book draws upon classical mathematical material from discre......一起来看看 《An Introduction to the Analysis of Algorithms》 这本书的介绍吧!