python类

一、声明

使用class声明类,建议类名单词首字母大写。

“新式类”和“经典类”的区分在Python 3之后就已经不存在,在Python 3.x之后的版本,因为所有的类都派生自内置类型object(即使没有显示的继承object类型),即所有的类都是“新式类”。

新式类:

class Management(object):
    def add():
        pass

经典类:

class Management:
    pass

二、类的属性

1. 公有属性

在类里直接定义的属性,它在类名下面直接定义。

 调用:1、类中调用:类名.属性名 ,更改原公有属性值

      2、实例调用:实例.属性名

实例:

class Management(object):
    num = 10
 
    def add(self):
        Management.num +=10            # 类中调用公有属性并更改值,num=11
        pass
 
s1 = Management()
s2 = Management()
 
# 第一种情况:s1实例中调用公有属性,s2实例没有调用公有属性
s1.num +=1
Management.num += 2
"""
<结果>
s1不变,s2和Management都改变了
s1_num:11   s2_num:12   Manage_num:12
"""
 
# 第二种情况:先调用s1实例公有属性,再通过S1调用add更改,然后再使用类更改
s1.num +=1
s1.add()
Management.num += 2
"""
<结果>
先调用的s1实例num依然不变,s2和Management都被修改了
s1_num:11   s2_num:22   Manage_num:22
 
"""

为什么修改num的值以后,实例s1和实例s2会有不同的结果呢 ?

因为公有属性查找的顺序是:先找实例的公有属性,没找到再找类里的公有属性

2. 私有属性

​ 加两个下划线,__membername,编译的时候自动加上类名,变成_classname__membername,这种技术叫变量名压缩(mangling),以达到外部不能调用的目的。实际使用_classname__membername是可以调用的,但是不符合规定。标准方法是通过定义函数来获取。
实例:

class Classname(object):
 '''this is a demo!'''
 def __init__(self):
  self.__membername = 88
 
 def read_membername(self):            # 标准的外部访问方法,使用函数来读取私有属性。
  return self.__membername
 
s= Classname()
print(s._Classname__membername)
print(s.read_membername())
'''
<结果>
88
88
------像下面的调用,会出现AttributeError错误------
print(s.__membername)
'''

三、类方法

1. 构造方法: __init__

class Person(object):
    def __init__(self,person_name, person_age)

2. 析构方法: __del__

class Hello(object):
    def __del__(self):
        print("你删除了实例")
# 在python上测试
instance = Hello()
del instance
# 当然也可以使用实例调用,但没有这么用的~~
instance.__del__()

3.自定义方法

静态方法:@staticmethod,不需要访问类里的任何参数。所带的参数都是从外部传入的。

​ class Person(object):
​ def init(self,person_name, person_age):
​ self.name = person_name
​ self.age = person_age

    @staticmethod
    def info(country):
        print(country)

类方法: @classmethod,第一个参数必须是类属性。

​ class Person(object):
​ country = "china"
​ def init(self,person_name, person_age):
​ self.name = person_name
​ self.age = person_age

    @classmethod
    def info(country):
        print(country)

属性方法:@property把一个函数变成一个静态属性

直接调用函数名字,不需要加括号,就能获取到函数返回值。一般用在不注重过程,只要结果的情况!

class Person(object):
    country = "china"
    def __init__(self,person_name, person_age):
        self.name = person_name
        self.age = person_age
 
    @property
    def health_point(self):
        print("HP:【{}】".format(self.age*2))
        return self.age*2
 
P = Person("laowang",23)
P.health_point                # 不需要括号,看起来完全是一个属性,这就是属性方法
 
'''上面的类属性只是只读的,即然是叫属性,那么只读就显得太LOW了'''

类属性装饰器@property,装饰以后,函数就有:赋值setter\销毁deleter两个方法。

class Person(object):
    country = "china"
    def __init__(self,person_name, person_age):
        self.name = person_name
        self.age = person_age
 
    @property
    def health_point(self):
        self.age = self.age*2
        print("HP:【{}】".format(self.age))
        return self.age
 
    @health_point.setter                    # 增加了一个赋值方法
    def health_point(self, add):
        self.age = add
 
    @health_point.deleter                   # 增加了一个销毁属性的方法
    def health_point(self):
        del self.age
 
P = Person("laowang", 33)
print(P.health_point)
 
P.health_point = 22                        # 给health.point赋值
print(P.health_point)
 
del P.health_point                         # 销毁属性

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×