Python3入门与实践(四): 面向对象

  • 类变量 直接在类里面定义
class Student():
    sum_student = 0
  • 实例变量 在实例方法里通过self.xxx进行定义和读取
class Student():
    # 构造函数 __init__ 
    def __init__(self,name):
        self.name = name
    # 实例方法第一个参数不是必须叫self,但是第一个参数代表的是实例本身(this)        
    def print_name(self):
        print(self.name)
  • 内置函数 dict
__dict__在类中代表类的全部属性的字典,在实例中代表对象的全部属性的字典
print(student.__dict__)
print(Student.__dict__)

==当通过 student.name获取变量值的时候,首先会查找实例变量里有没有name属性,如果有则返回,如果没有就会去类变量里找,如果还是没有则会报错==

  • 实例方法
  1. 实例方法通过self.xxx访问实例变量和类变量,具体区分参考上文,不推荐
  2. 实例方法可以通过self.class.xxx访问类变量
  3. 实例方法不可以直接访问类变量
class Student():
    sum_student = 0
    
    def __init__(self,name):
        self.name = name
        
    def print_name(self):
        # 实例方法不可以直接访问类变量
        # print(sum_student)
        # 这样可以访问类变量,但是不推荐
        print(self.sum_student)
        # 实例方法访问类变量的正确打开方式
        print(self.__class__.sum_student)
        # 访问实例字典
        print(self.__dict__)
        print(self.name)
  • 类方法 和 静态方法

==类方法和静态方法不能访问实例方法!!!!==

class Student():
    sum_student = 0
    
    # 类方法,第一个参数代表类本身
    @classmethod
    def add_and_print_sum(cls):
        cls.sum_student+=1
        print(cls.sum_student)
        
    # 静态方法,与类方法不同的是可以不用传第一个参数
    @staticmethod
    def add(x,y):
        # 访问类变量(所有地方都可以这样访问类变量)
        print(Student.sum_student)
        print(x+y)
  • 私有方法和私有变量

在方法或者变量前加__ 构造函数init 可以通过外部访问,是因为init前后都有‘__’, 这是python的内置命名风格,自己命名尽量不要这样做

class Student():
    def __init__(self,name,score):
        self.__name = name
        self.__score = score
        
    def __check_score(self,score):
        if score>100 or score<0 :
            print("分数必须在0-100之间")
            return False
        return True
        
    def marking(self,score):
        if not self.__check_score(score):
            return
        self.__score = score
        print(self.__name+"的当前分数:"+str(self.__score))

==注意==

stu = Student('gwf',10)

# 这样操作虽然是可以的,但是这不是我们在方法中定义的私有变量__score,而是基于python动态语言的特性,又创建了一个__score的变量
stu.__score = -1
print(stu.__score)

# 真正我们创建的私有变量,在python中是以_Student__score(_类名__私有变量名)进行保存的
print(stu.__dict__)
# 上面代码打印的结果为{'name': 'gwf', '_Student__score': 10, '__score': -1}
# 可以通过stu._Student__score 访问到真正的私有变量,但是不推荐这样做
print(stu._Student__score) # 输出 10 
  • 继承
class Human():
    def __init__(self,name,age):
        self.__name = name
        self.__age = age

    def do_homework(self):
        print("这是一个父类方法")
    
    def get_name(self):
        return self.name

class Student(Human):
    def __init__(self,name,age,school):
        # 不建议这样用
        # Human.__init__(self,name,age)
        # 正确用户
        super(Student,self).__init__(name,age)
        self.school = school
        
    def do_homework(self):
        super(Student,self).do_homework()
        # 不可以这样访问父类变量
        # print(self.__name)
        # print(super(Student,self).__name)
        print(super(Student,self).get_name()+"正在做作业")

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GreenLeaves

JavaScript之数组学习

在JavaScript中,数组用关键字Array来声明。声明数组的同时还可以指定数组初始元素的大小,也就是数组的长度;下面代码定义了一个数组长度为6的数组; v...

253100
来自专栏大闲人柴毛毛

稳扎稳打JS——this

this的值是在运行时确定的 JS中的this究竟代表什么,这是在程序运行时根据上下文环境确定,可以分为以下几种情况。 1. 全局作用域中的this 在全局作...

42550
来自专栏Django Scrapy

python使用正则表达式

正则表达式 目标: 了解 : (0)\w 匹配 一个字母或者数字 (1)\d 只匹配数字 (2)\s 至少匹配一个空格 同理"\_","\-"分别匹配 ...

40680
来自专栏开发与安全

从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)

首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下: template < class _Ty, cl...

35000
来自专栏程序员互动联盟

【编程基础】C语言之指针二

指针和数组 C语言的数组表示一段连续的内存空间,用来存储多个特定类型的对象。与之相反,指针用来存储单个内存地址。数组和指针不是同一种结构因此不可以互相转换。而数...

37840
来自专栏GreenLeaves

auguements实参对象的数组化

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Ti...

220100
来自专栏用户2442861的专栏

互联网几道常考易错笔试题总结

转载于http://blog.csdn.net/chhuach2005/article/details/40322895

12320
来自专栏前端知识分享

js数组常用方法总结

最近工作中经常用到数组操作,每次都傻傻不知道怎么用,今天有时间整理了一下,希望对大家有帮助!这些基础的知识,要熟记于心。

1.1K30
来自专栏liukaili_666888999

Swift变量 常量

11520
来自专栏HTML5学堂

JavaScript | 获取数组中的单词并统计出现次数

HTML5学堂(码匠):如何通过JavaScrip实现数组元素的查找?在一个数组当中,找到所有的单词,并统计每个单词出现的次数。 功能需求 在一个自定义数组...

62970

扫码关注云+社区

领取腾讯云代金券