对Python中类的理解
1. 类和对象
- 我们学过很多编程语言,其中有面向过程的,如函数式编程和C语言,也有面向对象的,如Jav,Python,C++,接下来就简单谈谈对类和对象的理解
- 类:就是事物的抽象,如:汽车模型
- 对象:类的一个实例,如:QQ轿车,大客车等等
2. 类的定义(Python)
- class是定义类的一个关键字,而且注意类名首字母要大写
- 要创建的类型不能用简单的类型表示时就需要创建类
- 类把变量和函数组合在一起,这也就是称之为封装,在类中变量和函数分别称之为属性和方法
- 面向对象有三大特征:封装、继承。多态,这里只说它的封装
- class 类名(成员变量+成员函数)
class Text:
first=123
second=456
def f(self):
print("text")
milo=Text # milo是Text的一个实例化对象
print(milo.f)
print(milo.first)
3. 对象的创建
- 创建对象的过程称之为实例化,当一个对象被创建之后,包含三个特性:对象的句柄、属性和方法
- 如 milo=Text # milo是Text的一个实例化对象
4. 类属性
类属性三大特点:
1 类属性从属于类;
2. 访问类属性,可以通过类名来访问,也可以通过对象来访问;
3. 修改或删除类属性只能通过类名来修改或者删除。
具体看一段代码
"——————类属性————————"
class User(object):
name="张三" #公共的类属性
__passward = '123456' #私有(隐藏)的类属性
def __init__(self,sex,username):
self.sex = sex
self.name = username
class QQ_User(User): #继承父类User
pass
###类的属性
u=User("男","globin") #类的实例化
print(u.name) #对象属性和类属性名字一样时,如果你通过对象来访问则会返回对象方法的属性,如globin
print(User.name) #如果你通过类来访问,则返回类的属性而不是对象方法的属性,和下面子类的原理也是一样的
print(QQ_User.name) #name从父类继承过来的,name属于类属性,可以通过类来访问,也可以通过类的对象来访问
###类属性的修改
u.name="王五"
print(u.name)#输出“王五”,本质上没有修改类的属性,只是给该对象定义了一个对象属性name,赋值为“王五”
print(User.name) #本质上通过对象是不能修改类属性的
User.name="赵四" #通过类来修改类属性是可以的
print(User.name)
###类属性的删除
del u.name #本质上只是删除了对象的name属性,而没有删除类的属性,通过对象和类访问类属性都是没有发生改变的
print(u.name)
print(User.name)
5. 类方法
- 类方法是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以’cls’作为第一个参数的名字,就最好用’cls了),能够通过实例对象和类对象去访间。
"——————类方法——————"
class A(object) :
name="张三"
def test1 (self):
print("A的test1方法")
@Classmethod
del test2 (cls): #类方法一定要在该方法的上面加一个修饰器(java中是注解),类方法的参数是cls,代表当前的类
cls.name="王五"
print("A的test2方法")
a=A()
a.test2()
A.test2()
print(A.name)
小结
- 如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。