Python基础语法-01-类及对象

Python中的类

Python中定义一个类的方式:

1)Python2中定义类的方式

class 类名:
    属性
    方法

2)Python3中定义类的方式

class 类名(object):   #不继承其他类时使用object类,需要继承父类就在括号内写父类的名称
    属性
    方法

Python2定义类的方式已经基本不使用

1 类固有的属性和方法

Python中的类有不通过定义就可以使用的属性和方法,这些属性和方法都有特殊的功能和作用,其中这些不定义就存在的方法又叫做魔法方法,它们的名称有固定的格式,即__xxxx__()

1.1 self属性

self是Python中的类自带的属性,不需要定义即可使用,它是一个指向调用它的对象的引用,可以简单的理解为对象自身的意思
一个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可

1.2 __init__()方法

用于给新建的对象进行初始化。在对象创建时自动执行,给新建的对象初始化。该方法可以自定义参数,没有返回值

方法的执行时机

其所在的类的对象创建时执行

方法的参数

__init__()方法有一个默认参数self,位于参数列表的第一位,用于将本对象的引用传递给__init__()方法。还可以传递自定义参数,格式如下:

def __init__(self, 自定义参数A, 自定义参数B...):
        ...

下面用一个例子说明__init__()方法的特点:

# 定义汽车类
class Car:

    def __init__(self, newWheelNum, newColor):
        self.wheelNum = newWheelNum
        self.color = newColor

# 创建对象
BMW = Car(4, 'green')

print('车的颜色为:%s'%BMW.color)
print('车轮子数量为:%d'%BMW.wheelNum)

执行结果为:
这里写图片描述

由以上例子可以看出__init__()方法不需要调用,在对象创建时会自动执行。同时可以接收参数给对象的属性赋值(即初始化)

1.3 __new__()方法

该方法的主要作用就是创建对象,这个方法和__init__()方法 一样不需要调用,在对象创建时自动执行

方法参数

该方法至少要有一个参数cls,cls代表要实例化的类,此参数在实例化时由Python解释器自动提供

方法返回值

必须要有返回值,返回实例化的实例(即创建出来的对象),这点在自己重写__new__()方法时要特别注意,可以return父类创建出来的实例,或者使用object类创建出来的实例

class A(object):
    def __init__(self):
        print("这是 init 方法")

    def __new__(cls):
        print("这是 new 方法")
        return object.__new__(cls) #使用object类创建出来的实例

a = A() #创建对象

1.4 __del__()方法

创建对象后,python解释器默认调用__init__()方法给对象初始化,当删除一个对象时,python解释器也会默认调用一个方法,__del__()方法,用于删除对象

__del__()方法的参数和__init__()方法一样,第一个参数为self,用于将对象的引用传递给方法

当有1个变量保存了对象的引用时,此对象的引用计数就会加1,当使用__del__()方法删除变量指向的对象时,如果对象的引用计数不为1(假设为3),那么此时只会让这个引用计数减1,变为2,当再次调用__del__()方法时,变为1,如果再次调用__del__()方法,这是引用计数为0,没有引用指向该对象,此时就会把对象从内存中删除

2 类自定义的属性和方法

2.1 类属性

属于类的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似
类属性分为共有和私有两类,私有类属性在定义时名称前加两个下划线“__”。对于公有的类属性,在类外可以通过类对象和实例对象访问,而私有的类属性则不可以在类外可以通过类对象和实例对象访问

class People(object):
    name = 'Tom'  #定义一个公有的类属性
    __age = 12    #定义一个私有的类属性

p = People()

print(p.name)               #正确
print(People.name)          #正确
print(p.__age)              #错误,不能在类外通过实例对象访问私有的类属性
print(People.__age)         #错误,不能在类外通过类对象访问私有的类属性

2.2 实例属性

属于对象的属性,实例属性通过__init__()方法进行定义
由于实例属性属于具体的对象,所以实例属性只能通过对象名访问,不能通过类名访问

#定义一个类
class People(object):
    address = '山东'              #定义一个类属性
    def __init__(self):
        self.name = 'xiaowang'   #定义一个实例属性
        self.age = 20            #定义一个实例属性

#创建一个对象
p = People()

#访问实例属性
p.age =12                        #修改实例属性
print(p.address)                 #正确
print(p.name)                    #正确
print(p.age)                     #正确

#访问类属性
print(People.address)            #正确
print(People.name)               #错误
print(People.age)                #错误

注:如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去修改,会在实例对象中产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性

class People(object):
    country = 'china' 


print(People.country)
p = People()
print(p.country)
p.country = 'japan' 
print(p.country)      #实例属性会屏蔽掉同名的类属性
print(People.country)
del p.country         #删除实例属性
print(p.country)

程序执行结果:

这里写图片描述

2.3 实例方法

类中最常见的方法,其特征是方法的第一个参数为属性self,其作用是将对象的引用传递给方法

实例对象的创建:

class People(object):
    country = 'china'

    def getCountry(self):
        print (self.country)

2.4 类方法

用修饰器@classmethod修饰的方式为类方法,类方法的第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以“cls”作为第一个参数的名字,所以最好用“cls”),实例对象和类对象都可以调类方法

类方法可以修改类属性

class People(object):
    country = 'china'

    #类方法,用classmethod来进行修饰
    @classmethod
    def getCountry(cls):
        return cls.country

    @classmethod
    def setCountry(cls,country):
        cls.country = country


p = People()
print p.getCountry()       #通过实例对象引用
print People.getCountry()  #通过类对象引用

#修改类属性
p.setCountry('japan')   

print p.getCountry() 
print People.getCountry()  

执行结果:
这里写图片描述

2.5 静态方法

通过修饰器@staticmethod修饰的方法

class People(object):
    country = 'china'

    @staticmethod
    def getCountry():
        return People.country

print People.getCountry()

猜你喜欢

转载自blog.csdn.net/eagleuniversityeye/article/details/80066679