python学习day11 面向对象编程 类和实例

Posted afly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习day11 面向对象编程 类和实例相关的知识,希望对你有一定的参考价值。

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

 

以上是关于python学习day11 面向对象编程 类和实例的主要内容,如果未能解决你的问题,请参考以下文章

python开发学习-day07(面向对象之多态类的方法反射新式类and旧式类socket编程)

Python_Day7_面向对象学习

学习python_day6

python基础学习日志day6-面向对象

Python学习之路——Day8(面向对象进阶)

Python--day7--面向对象编程进阶