zoukankan      html  css  js  c++  java
  • python class

    上个学期一直用python在刷codewars,写的都是小程序,也没用到类这些东西,这个学期要看一堆代码,发现对类的理解有点欠缺,所以来补一补。

    属性:

    python的类属性有两种。

    第一种是类数据属性,可以通过类和实例来访问,被类所拥有。在类定义之后,可以通过类名进行添加,添加的类数据属性也可以被类和所有实例对象所访问和修改。

    第二种是实例数据属性

    以一个下划线开头,类似于  _xxx,属于类的私有属性(private),但是在定义类的文件中可以在类的外部访问到这类属性,这类属性的意思是尽管我可以直接访问,也请你要慎重使用。用import从外部引进该类时,不能直接访问该类的以一个下划线开头的私有属性。

    以两个下划线开头,类似于  __xxx,属于类的私有变量(private),只有内部可以访问,外部不能访问。

    以两个下划线开头,两个下划线结尾,类似于 __xxx__,可以被外部访问。

    class Student(object):
            School = ""
            def __init__(self,name,grade,gender):
                    self._name = name
                    self.__grade__ = grade
                    self.__gender = gender
    
    Student.School = "XJTU"
    zh = Student("zh","Junior","female")
    
    print(Student.School,zh._name,zh.__grade__)
    print(zh.__gender)

    运行结果:

    zhuh@baojp-24000649:~/pra$ python3 class1.py
    XJTU zh Junior
    Traceback (most recent call last):
      File "class1.py", line 12, in <module>
        print(zh.__gender)
    AttributeError: 'Student' object has no attribute '__gender'

    可以看出Student 中的 __gender不能在外部被访问,其他都可以被访问。双下划线开头的实例变量并不是完全不可以被外部访问,不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量,但是不同的解释器会有不同的更改方式。

    方法:

    一个类中有三种方法。

    第一种是实例方法,定义实例方法时第一个参数必须是self,代表实例本身,实例方法只能通过实例来调用。

    第二种是类方法,定义类方法时以cls作为第一个参数,cls表示类本身,定义时使用@classmethod装饰器。通过cls可以访问类的相关属性类方法可以通过类名访问,也可以通过实例访问。

    第三种是静态方法,静态方法没有参数限制,既不需要实例参数,也不需要类参数,定义的时候使用@staticmethod装饰器。同类方法一样,静态法可以通过类名访问,也可以通过实例访问。

    实例方法和类方法可以重载和继承,但是静态方法不可以继承,可以认为是全局函数。静态方法和类方法都只能对类属性进行操作,对实例属性不能操作。

    class Student(object):
           //同前面一样
            @staticmethod
            def print_info_s():
    
                    print(Student.School,Student._name,cls.__grade__,cls.__gender)
    
    
    
    Student.School = "XJTU"
    zh = Student("zh","Junior","female")
    zh.print_info_s()

    运行结果

    zhuh@baojp-24000649:~/pra$ python3 class1.py
    XJTU
    Traceback (most recent call last):
      File "class1.py", line 22, in <module>
        zh.print_info_s()
      File "class1.py", line 15, in print_info_s
        print(Student.School,Student._name,cls.__grade__,cls.__gender)
    AttributeError: type object 'Student' has no attribute '_name'

    完整代码:

    class Student(object):
            School = ""
            def __init__(self,name,grade,gender):
                    self._name = name
                    self.__grade__ = grade
                    self.__gender = gender
            def print_info_c(self):
                    print(self.School,self._name,self.__grade__,self.__gender)
            @classmethod
            def print_info_m(cls):
                    print(cls.School)
    
            @staticmethod
            def print_info_s():
    
                    print(Student.School)
    
    
    
    Student.School = "XJTU"
    zh = Student("zh","Junior","female")
    zh.print_info_c()
    zh.print_info_m()
    Student.print_info_m()
    zh.print_info_s()
    Student.print_info_s()

    运行结果

    zhuh@baojp-24000649:~/pra$ python3 class1.py
    XJTU zh Junior female
    XJTU
    XJTU
    XJTU
    XJTU
  • 相关阅读:
    Node.js 学习笔记(二)
    微服务网关 zuul 替代者 gateway 网关路由
    flowable 6.6.0 绕过自带的登录限制(免登录)
    `flowable.common.app.idmurl` must be set (flowable 6.6.0)
    gateway 跨域问题解决方案
    ueditor 在springboot 打jar运行时 找不到图片附件路径问题
    springboot 打jar 包部署时 读取外部配置文件
    Navicat连接MySQL Server8.0版本时出现Client does not support authentication protocol requested by server;解决如下
    flowable 通过模型model ID部署流程
    springboot 配置日志输出
  • 原文地址:https://www.cnblogs.com/catpainter/p/8494870.html
Copyright © 2011-2022 走看看