栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

三、python: 类

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

三、python: 类

1. 类的创建:


Python语言中,使用class关键字来创建类,其创建方式如下:

class ClassName(bases):
    # class documentation string 类文档字符串,对类进行解释说明
    class_suite

class是关键字,bases是要继承的父类,默认继承object类。
class documentation string是类文档字符串,一般用于类的注释说明。class_suite是类体,主要包含属性和方法。

类、属性和方法的命名约定惯例如下:

类名表示实例的抽象,命名时首字母大写;
属性使用名词作为名字,比如name、age、weight等;
方法名一般指对属性的操作,其命名规则一般采用动词加属性名称形式,如updataName、updataAge、updataWeight等。 举例如下:

# 类定义
class People:  # 类名
    name = "张三"  # 属性名

    def undate_name(self, name):# 方法名
        self.name = name  

Python的类分为以下两种: 经典类 新式类

经典类:Python2.x中类定义的默认方式,不继承object类,其内部由属性和方法组成。经典类定义的典型方式如下:

# 经典类是指没有继承object类
class A:
    pass


新式类:Python3.x中类定义的默认方式,必须继承object方法,其典型定义方式如下:

# 新式类是指继承object的类
class A(object):
    pass


新式类修复了经典类的一些bug(如多重继承时的歧义等),并且提供了对类方法和静态方法的支持。
在Python3.x中,如果没有显示指明要继承的父类,则默认继承object类。

class A:
    pass


class A():
    pass


class A(object):
    pass

Python3.x中,无需继承时,例子中三种类的创建效果一样。自动继承object类。

2. 对象的创建:


类创建完之后,就应该创建该类的实例或对象了,该过程称之为实例化。当一个对象被创建后,就包含标识、属性和方法这三个方面的对象特性了。其中,对象标识用于区分不同的对象,属性和方法与类中的成员变量和成员函数相对应

people = People("李四", 20, "50kg")  # 实例化一个对象

如例子所示,对象标识符为people,属性为括号中内容,方法为类中方法

3. 类的属性 :


Python语言中,属性分为类级别和实例级别两种。实例级别的属性值默认共享类级别的属性值。除非显式进行赋值操作。下面举一个例子来说明。

class A():
    age = 10


obj2 = A()
obj3 = A()

如例子所示,存在三个实例,分别是类实例A和对象实例obj2、obj3。在情形1中,obj2和obj3这两个对象实例共享类实例A的属性age;

情形1

print(obj2.age, obj3.age, A.age)

情形2: 在情形2中,显示修改了对象实例obj1的属性aaa;

obj2.age+=2
print(obj2.age, obj3.age, A.age)


情形3:在情形3中,修改了类实例A的属性aaa。

A.age+=3
print(obj2.age, obj3.age, A.age)

结果所示:

情景1:
10 10 10
情景2:
12 10 10 
情景3:
12 13 13


在情形2中已经修改了对象实例obj2的属性值age,其属性值和类实例A的属性值已经独立。而对象实例obj3的属性从来没有修改过,所以它还是和类实例A的属性值保持一致。

Python语言对于属性的设置采用“类.属性 = 值”或“实例.属性 = 值”的形式。如上例中obj2.age += 2等价于obj2.age = obj2.age + 2,该语句包含了属性获取及属性设置两个操作。

Python语言中的属性操作遵循三个规则:
(1)属性的获取是按照从下到上的顺序来查找属性;
(2)类和实例是两个完全独立的对象;
(3)属性设置是针对实例本身进行的。

类的定义由属性和方法组成,属性是对数据的封装,方法则是对类行为的封装。属性按使用范围分为公有属性和私有属性

python类的成员没有访问控制限制,这与其他面向编程的语言不同。
通常约定以两个下划线开头,但是不以两个下划线结束的属性是私有的,其他为公共的。注意,不能直接访问私有属性,但可以通过方法中访问.

class A:
    __name='class A'
    def dd(self):
        print('私有属性')
sg=A()
sg.dd()
print(sg.__name)


执行出来会报错:

Traceback (most recent call last):
  File "G:/I like study/1.6.py", line 7, in 
    print(sg.__name)
AttributeError: 'A' object has no attribute '__name'
私有属性

所以不能直接访问私有属性,不然直接报错。但可以在方法中访问:

class A:
    __name='class A'
    def dd(self):
        print(A.__name)
sg=A()
sg.dd()

输出结果:

class A

4. 类的方法:


类方法也包括公有方法、私有方法、类方法和静态方法。

类的(公有)方法:

   在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。

类的私有方法:

__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。

#问女性的姓名、工作是没有问题的,但是问女性的年龄、体重是不礼貌的,所以我们把女性年龄定义为私有属性
#定义显示女性的姓名、工作为公有方法,显示女性年龄、体重为私有方法
#类的定义部分
class Woman():
    name = "Juckes"  #类的公有属性
    job = "Teacher" 
    __ages = 30      #类的私有属性
    __weight = 60

    def disp_nj_info(self):  #类的(公有)方法
        print("Name:{}, Job:{}".format(self.name,self.job)) #类的内部调用公有属性

    def __disp_aw_info(self):  #类的私有方法
        print("Age:{}, Weight:{}".format(self.__ages, self.__weight))  #类的内部调用私有属性

    def dis_all_info(self):
        self.disp_nj_info() #类的内部调用公有方法
        self.__disp_aw_info() #类的内部调用私有方法

类外使用类的公有属性, True

#主程序部分
womanA = Woman()

print(womanA.name, womanA.job)

运行结果:

Juckes Teacher

类外使用类的私有属性, False

#主程序部分
womanA = Woman()

print(womanA.__ages, womanA.__weight)

结果:

Traceback (most recent call last):
  File "D:/untitled2/timer_test.py", line 60, in 
    print(womanA.__ages, womanA.__weight)
AttributeError: 'Woman' object has no attribute '__ages'

类外使用公用方法,True

#主程序部分
womanA = Woman()

womanA.disp_nj_info()

结果:

Name:Juckes, Job:Teacher

类外使用类的私有方法, False

#主程序部分
womanA = Woman()

womanA.__disp_aw_info()

结果:

Traceback (most recent call last):
  File "D:/untitled2/timer_test.py", line 60, in 
    womanA.__disp_aw_info()
AttributeError: 'Woman' object has no attribute '__disp_aw_info'

类外通过调用公有方法的方式,间接调用私有方法,True

在这里插入代码片#主程序部分
womanA = Woman()

womanA.dis_all_info() #通过调用dis_all_info,间接调用__disp_aw_info

结果:

Name:Juckes, Job:Teacher
Age:30, Weight:60

5. 类间关系:

依赖关系 关联关系 继承关系

依赖关系:由于python是一门弱类型编程语言,并且所有的对象之间其实都是多态的关系,也就是说,所有的东西都可以当做对象来使用, 所以我们在写代码的时候很容易形成以上关系.首先,我们先看第一种, 也是这些关系中紧密程度最低的一个, 依赖关系.

class Person():
    def play(self, tools):
        tools.run()
        print("很开心,能玩游戏了")


class Computer():
    def run(self):
        print("电脑开机,可以运行")


class Phone():
    def run(self):
        print("手机开机,可以运行")


c = Computer()
phone = Phone()
p = Person()
p.play(phone)

输出:

手机开机,可以运行
很开心,能玩游戏了

例子定义了Person、Computer、Phone三个类,在Person类的play()方法中,可以使用Computer类或Phone类的实例作为参数。因为在Person类方法中实现时需要Phone类实例调用方法完成,所以这两个类之间存在依赖关系。

冰箱的功能非常简单, 只要会开门关门就行了. 但是大象就没那么简单了,想想,大象开门和关门的时候是不是要先找个冰箱啊, 然后呢? 打开冰箱门,是不是打开刚才找到的那个冰箱门, 然后装自己,最后呢? 关冰箱门, 注意, 关的是刚才那个冰箱吧. 也就是说, 开门和关门用的是一个冰箱,并且大象有更换冰箱的权利, 想进哪个冰箱就进哪个冰箱. 这时, 大象类和冰箱类的关系并没有那么的紧密,因为大象可以指定任何一个冰箱. 接下来,我们把代码完善一下.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/921077.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号