类与实例
类(Class)和实例(Instance)
- 类是抽象的模板
- 实例是根据类创建出来一个个具体的“对象”,每个对象都具有相同的方法,但各自的数据可能不同
定义类(class)
- class 类名(类名通常首字母大写)(object):
- object类是所有类最终都会继承的类
创建实例
- 实例1 = 类名 + ()
- 如: Zhangsan = Student()
由于类是实例的模板,故可以在类中创建一些属性,只要是该类实例都具有该属性
方法可以通过\__init__方法
- \__init__(self,...):
1、第一个参数永远都是self,表示创建的实例本身,
可以把各种属性绑定到self,因为self就指向创建的实例本身
2、self,后面的参数都可以自定义,需要什么参数创建什么参数
注意:有了\_\_init\_\_方法,在创建实例的时候,就不能传入空的参数了,
必须传入与\_\_init\_\_方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去
# 定义学生类
class Student(object):
def __init__(self,name,score):
self.name = name
self.score = score
# 创建实例
stu1 = Student('张三',99)
print(stu1.name)
print(stu1.score)
数据封装
- 面向对象编程其中重要特点就是封装
- 在创建好实例后,还需要在定义一个函数,将数据一一打印出来,
- 既然实例中本身就具有数据,故没必要从外面的函数访问,
可直接在Student类中定义访问数据的函数,这样就把“数据封装起来了” - 封装数据的函数是与类本身是关联的,称为类的方法
# 定义学生类
class Student(object):
def __init__(self,name,score):
self.name = name
self.score = score
#定义访问数据的函数
def visit(self):
print("%s:%i" %(self.name,self.score))
stu2 = Student("法外狂徒张三",60)
stu2.visit()
访问限制
在Class内部,可以有属性和方法,从外部代码可通过直接调用实例变量的方法操作数据,从而隐藏了内部的复杂逻辑
从student类中看,外部代码也可自由修改实例的变量值
如果要让内部属性不被外部访问,可以把属性的名称前加两个下划线__
在python中,实例的变量如果以__开头,就变成了一个私有变量(private)
只有内部可以访问,外部不能访问
确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮
\_\_xxx\_\_、\_xxx、\_\_xxx区别
1、\_\_xxx\_\_:以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的
2、_xxx:一个下划线开头的实例变量名外部是可以访问的,但是,
按照约定俗成的规定,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”
3、\_\_xxx:私有变量 ( 是不是一定不能从外部访问呢?其实也不是 )
# 定义学生类
class Student1(object):
# 创建学生属性函数
def __init__(self,name,score):
self.__name = name
self.__score = score
# self.name = name
# self.score = score
#创建访问数据函数
def visit(self):
print("%s:%s" %(self.__name,self.__score))
# print("%s:%s" % (self.name, self.score))
#创建stu1实例
stu1 = Student1('张三',89)
#调用class中的方法
stu1.visit()
stu1.score = 99
stu1.visit()
获取对象信息
如果要获得一个对象的所有属性和方法,可以使用dir()函数,返回一个包含字符串的list
配合getattr()、setattr()以及hasattr()
getattr() 函数用于返回一个对象属性值
语法:getattr(object, name[, default])
setattr() 函数对应函数 getattr(),用于设置属性值,该属性不一定是存在的
setattr(object, name, value)
hasattr() 函数用于判断对象是否包含对应的属性
hasattr(object, name)
通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据
要注意的是,只有在不知道对象信息的时候,我们才会去获取对象信息
实例属性和类属性
Python是动态语言,根据类创建的实例可以任意绑定属性
类属性:在类中定义的属性
实例属性:创建实例后,实例自己的属性
注意:实例属性和类属性使用相同的名字,实例属性将屏蔽掉类属性(优先级:实例属性 > 类属性),
但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性
>>> s = Student()
>>> s
<__main__.Student object at 0x000002C5687A75E0>
>>> print
<built-in function print>
>>> print(s.name)
Student
>>> s.name = 'ssss'
>>> print(s.name)
ssss
>>> del s.name
>>> print(s.name)
Student
本文系作者 @小白学安全 原创发布在 xbxaq.com 站点,未经许可,禁止转载!
评论