Python面向对象编程

定义类

class ClassName:
    """类的帮助信息"""  # 文档注释
    statement  # 类体
  • ClassName:类名,一般使用大写字母开头,如果类名中包含两个单词,第二个单词的首字母也大写,这种命名方法也称为 “驼峰式命名法” ,但首字母大写不是强制要求。
  • “”“类的帮助信息”"":用于指定类的说明、注释。
  • statement:类体,主要由类变量(或成员)、方法和属性等定义语句组成。如果定义类时,没想好类的具体功能,也可以在类体重直接使用pass语句代替。

示例代码:

class Geese:
    """大雁类"""
    pass 

创建类的实例

扩展小知识:什么是实例化?

class 语句本身并不创建该类的任何实例。所以在类定义完成后,可以创建类的实例,即实例化该类的对象。创建语法如下:

ClassName(parameterlist)
  • ClassName:必选参数,用于指定具体的类;
  • parameterlist:可选参数,当创建一个类时,没有创建__init__()方法,或者__init__()方法只有一个self参数时,parameterlist可以省略;

示例代码:

class Geese:
    """大雁类"""
    pass


wildGoose = Geese()  # 创建大雁类的实例
print(wildGoose)


执行结果:
	<__main__.Geese object at 0x000001E69D906438>

从上面执行的结果中可以看出,wildGoose是Geese类的实例。

创建__init__()方法

在创建类后,可以手动创建一个__init__()方法。该方法是一个特殊的方法,类似Java语言中的构造方法。每当创建一个类的新实例时,Python都会自动执行它。__init__()方法括号中必须包含一个self参数,并且必须是第一个参数。self参数是一个指向实例本身的引用,用于访问类中的属性和方法。在方法调用时会自动传递实际参数self,因此当__init__()方法只有一个参数时,在创建类的实例时就不需要指定实际参数了。

说明:__init__()方法的名称中,开头和结尾处是两个下划线(中间没有空格),这是一种约定,旨在区分Python默认方法和普通方法。

示例代码1:

class Geese:
    """大雁类"""
    def __init__(self):  # 构造方法
        print("我是大雁")


wildGoose = Geese()  # 创建大雁类的实例

执行结果:
	我是大雁

示例代码2:

class Geese:
    """大雁类"""
    def __init__(self, name, colour, num):  # 构造方法 也可以不写为self,叫其他名也可以,只是一般大家都习惯写self
        # print(f"有{num}只{name}是{colour}")
        print("有%s只%s是%s" % (num, name, colour))


name = '大雁'
colour = '白色'
num = '2'
wildGoose = Geese(name, colour, num)  # 创建大雁类的实例

执行结果:
	有2只大雁是白色

创建类的成员并访问

创建实例方法并访问

所谓实例方法是指在类中定义的函数。该函数是一种在类的实例上操作的函数。同__init__()方法一样,实例方法第一个参数必须是self,并且必须包含一个self参数。创建实例的方法格式如下:

class ClassName:

    def __init__(self):
        pass

    def FunctionName(self, parameterlist):  #类中的其他成员函数(方法)
        pass
  • ClassName:方法名
  • FunctionName:函数名
  • self:必要参数
  • parameterlist:可选参数,指定self以外的参数,各参数使用逗号","进行分隔。
class Geese:
    """大雁类"""
    def __init__(self, name, colour, num):  # 构造方法
        print(f"有{num}只{name}是{colour}")

    def fly(self, state):
        print(state)


name = '大雁'
colour = '白色'
num = '2'
wildGoose = Geese(name, colour, num)  # 创建大雁类的实例
print('=' * 12)
wildGoose.fly("展翅高飞")  # 调用实例方法

执行结果:
	有2只大雁是白色
	============
	展翅高飞

创建数据成员(类中的变量)并访问

数据成员是指在类中定义的变量,即属性,指定义位置,又可分为类属性和实例属性。

类属性:类属性是指定义在类中,并且在函数体外的属性。类属性可以在类的所有实例之间共享值,也就是在所有实例化的对象中使用。

说明: 类属性可以通过类名称或实例名访问。

示例代码1:

class Geese:
    """大雁类"""
    # global test
    # test = '测试全局变量'
    name = '大雁'
    colour = '白色'
    num = '2'

    def __init__(self):  # 实例方法(构造方法)
        print(f" 有{Geese.num}只{Geese.name}是{Geese.colour}")  #注意这里要类名.变量名才能访问到上面的变量(global申明定义的全局变量可以直接访问)
		# print('=' * 2, test, '=' * 2)

wildGoose = Geese()  # 创建大雁类的实例

执行结果:
	 有2只大雁是白色

示例代码2:

class Geese:
    """大雁类"""
    name = '大雁'
    colour = '白色'
    num = 0

    def __init__(self):  # 实例方法(构造方法)
        Geese.num += 1
        print(f" 第{Geese.num}只{Geese.name}是{Geese.colour}")
        print('=' * 14)


# 创建4个雁类的对象(相当于4只大雁)
list1 = []
for i in range(4):
    list1.append(Geese())  # 执行到这句代码就等于创建了一个对象
    # Geese()
print(f'【共{Geese.num}只白色大雁】')

执行结果:
	 第1只大雁是白色
	==============
	 第2只大雁是白色
	==============
	 第3只大雁是白色
	==============
	 第4只大雁是白色
	==============
	【共4只白色大雁】

访问限制

在内部定义的属性和方法,在类外可以直接调用或操作,如果想要外面不能进行操作用是怎么申明的呢:
1. 首尾双下划线表示定义特殊方法,一般是系统定义名字(那我们就不用这样式的)如__init__()
2. 以单个下划线开头的表示protected(保护)类型成员,只允许类本身和子类进行访问,但不能使用from module import *语句导入。

示例代码:

class Demo:
    _name = '张三'

    def __init__(self):
        print('__init__:', Demo._name)


out = Demo()
print('直接访问:', Demo._name)  # 必须使用类名.变量名(通过类的实例进行访问)

执行结果:
	__init__: 张三
	直接访问: 张三

从上面的运行结果中可以看出,保护属性可以通过示例名访问。

3. 双下划线表示private(私有)类型成员,只允许定义该方法的类本身进行访问,而且也不能通过类的实例进行访问,但是可以通过“类的实例名._类名__xxx”方式访问。

示例代码:

class Demo:
    __name = '张三'

    def __init__(self):
        print('__init__:', Demo.__name)


out = Demo()
print('直接访问:', Demo.__name)

执行结果:
	__init__: 张三
	Traceback (most recent call last):
	  File "D:/xuexi/python/Demo.py", line 9, in <module>
	    print('直接访问:', Demo.__name)
	AttributeError: type object 'Demo' has no attribute '__name'

从上面的运行结果可以看出:私有属性不能直接通过实例名+属性名访问,可以在类的实例方法中访问,也可以通过“实例名._类名__xxx”方式访问。

示例代码:

class Demo:  # 创建Demo类
    __name = '张三'

    def __init__(self):
        print('__init__:', Demo.__name)


out = Demo()  # 实例化(out就是实例名)
print('直接访问:', out._Demo__name)

执行结果:
	__init__: 张三
	直接访问: 张三

转载于:https://www.cnblogs.com/weibgg/p/10787002.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值