Python类和实例

#!usr/bin/env python3
# -*- coding: utf-8 -*-

'python默认第一个字符串是注释,可以用__doc__这个特殊变量引用'

# 作者名
__author__ = 'zhanglei'

class Student(object):
    name = 'Student'
    def __init__ (self, name, score, status):
        self.name = name
        self.score = score
        self.__status = status
    
    def get_status(self):
        return self.__status
    
    def set_status(self, status):
        if 0 <= status <= 1:
            self.__status = status
        else:
            raise ValueError('bad status')
    
    def get_grade (self):
        if self.score>=90:
            return 'A'
        elif self.score>=60:
            return 'B'
        else:
            return 'C'

if __name__ == '__main__':
    xm = Student('小明', 95, 1)
    xg = Student('小刚', 55, 1)
    
    print('%s:%s' % (xm.name, xm.get_grade()))
    print('%s:%s' % (xg.name, xg.get_grade()))
    print('%s:%s' % (xg.name, xg.get_status()))
    print(xm._Student__status)    
    print(xm.__status)    

关键词:class

继承和多态:(object)

如果没有其他需要继承的类,则默认继承(object)

#object -> Animal -> Dog -> Husky
class Animal (object):
  def run(self):
        print('Animal is running...')

class Dog(Animal):
  def run(self):
        print('Dog is running...')

class Husky(Dog):
  def run(self):
        print('Husky is running...')
# 通用方法,
def run_twice(animal):
    animal.run()
    animal.run()

多态这里和java有些区别,java中run_twice方法会限制参数是Animal或其子类,但是python只要是有run方法都可以执行run_twice方法。
准确来说run_twice方法的申明,animal和Animal一点关系没有,是动态申明
这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。

变量:

1、特殊变量:【__xxx__】 比如__name__,__author__,__doc__
2、私有变量:【__xxx】   比如 __status
3、虽然我可以被访问,但是,请把我视为私有变量,不要随意访问:【_xxx】 

如上述代码中name='Student',这个是类的属性,可以用Student.name='Student'调用
但是__init__方法也有name参数,所以实例也有name属性。xm.name='小明'
如果此时删除实例的name属性del s.name,此时xm.name='Student'
强烈建议不要类的属性和实例属性重名,实例的name会优先级高于类的name

对于私有变量:

class Student(object):
   def __init__ (self, name):
        self.__name = name
   def get_name(self):
        return self.__name
   def set_name(self, name):
        self.__name = name
# 1. 创建
>>> stu = Student('小红')
# 2. 通过封装的方法访问私有属性
>>> stu.get_name()
'小红'
# 3. 不允许直接访问
>>> stu.__name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute '__name'
# 4. 赋值__name
>>> stu.__name='小紫'
# 5. 其实上一步赋值并不是实例的私有属性,而是一个新属性,见下一步
>>> stu.__name
'小紫'
# 6. 私有属性值没变
>>> stu.get_name()
'小红'
# 7. 其实python把私有属性变量名隐式转换了,也是可以直接访问的,但是强烈不建议
>>> stu._Student__name
'小红'

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,...
    龙皓晨阅读 2,720评论 1 2
  • 面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思...
    时间之友阅读 4,179评论 0 0
  • 2019-05-12 类和实例 1.类和实例 实例是根据类创建出来的一个个具体的“对象”,每个对象由拥有相同的方法...
    牛发666阅读 1,306评论 0 0
  • 最近的1周,我很享受美妙的夜晚,傍晚我们一家三口和爷爷奶奶一起吃完丰盛的晚餐,佳萌会和爷爷奶奶一起玩纸牌,我把这看...
    杜娟0977阅读 2,087评论 0 0
  • 此时的我,躺在床上,敲击着屏幕上的拼音。作为一个职场的新人,虽然有着一些特殊的经历,但是依旧让我不能胜任这份工作。...
    厉英豪阅读 1,864评论 0 0

友情链接更多精彩内容