码迷,mamicode.com
首页 > 编程语言 > 详细

python第六天面向对象的编程

时间:2017-09-22 20:08:13      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:设置   setattr   rgs   prompt   tab   lap   int   面向对象   img   

类和实例

   定义 class  类名(父类名):  其中object是所有类的祖先类 

       __int__方法(两个下划线)表示把属性绑定到类上,如下把name、score等属性绑上去

        注意类中所有方法的第一个参数都是self表示对象本身,调用的时候不需要传递这个参数

技术分享
class Student(object):

    def __init__(self, name, score):
        self.name = name
        self.score = score
View Code

 

 限制访问:如果在实例的变量前加上两个下划线,那么此变量就被视为私有变量,只有内部可访问,外部需要通过方法访问,

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)
>>> bart.__name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: ‘Student‘ object has no attribute ‘__name‘

 

  Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name____score__这样的变量名。

不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量:但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名。

技术分享
>>> bart = Student(Bart Simpson, 98)
>>> bart.get_name()
Bart Simpson
>>> bart.__name = New Name # 设置__name变量!
>>> bart.__name
New Name
View Code

 

外部代码“成功”地设置了__name变量,但实际上这个__name变量和class内部的__name变量不是一个变量!内部的__name变量已经被Python解释器自动改成了_Student__name,而外部代码给bart新增了一个__name变量。不信试试:

>>> bart.get_name() # get_name()内部返回self.__name
‘Bart Simpson‘
继承多态类似与java
获取对象的信息

使用type()函数来判断对象的类型\
如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法:

>>> dir(ABC)
[__add__, __class__, __contains__, __delattr__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __getitem__, __getnewargs__, __gt__, __hash__, __init__, __iter__, __le__, __len__, __lt__, __mod__, __mul__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__, __rmod__, __rmul__, __setattr__, __sizeof__, __str__, __subclasshook__, capitalize, casefold, center, count, encode, endswith, expandtabs, find, format, format_map, index, isalnum, isalpha, isdecimal, isdigit, isidentifier, islower, isnumeric, isprintable, isspace, istitle, isupper, join, ljust, lower, lstrip, maketrans, partition, replace, rfind, rindex, rjust, rpartition, rsplit, rstrip, split, splitlines, startswith, strip, swapcase, title, translate, upper, zfill]

 仅把属性和方法列出来是不够的,配合getattr()setattr()以及hasattr(),我们可以直接操作一个对象的状态:

>>> hasattr(obj, ‘x‘) # 有属性‘x‘吗?
True
>>> obj.x
9
>>> hasattr(obj, ‘y‘) # 有属性‘y‘吗?
False
>>> setattr(obj, ‘y‘, 19) # 设置一个属性‘y‘
>>> hasattr(obj, ‘y‘) # 有属性‘y‘吗?
True
>>> getattr(obj, ‘y‘) # 获取属性‘y‘
19
>>> obj.y # 获取属性‘y‘
19

实例属性和类属性
如下定义一个类属性,可以同过实例访问,也可以同类类名.属性名访问,但是如果类属性名和实例属性名相同的话,实例属性名会覆盖了类属性。
class Student(object):
name = ‘Student‘







python第六天面向对象的编程

标签:设置   setattr   rgs   prompt   tab   lap   int   面向对象   img   

原文地址:http://www.cnblogs.com/09120912zhang/p/7576876.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!