Python面向对象编程(一) 类和对象

类和对象

Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言,而面向对象最重要的概念就是就是 对象

:用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。类是对象的模板。

对象:而对象是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。

  • 对象就是类进行实例化的产物
  • 实例化就是由类得到对象的手段

类的创建和实例化

python使用 class 关键字来创建类。class 后面跟类名,类名通常是一大写字母开头的单词。类名的后面跟(superClass),superClass表示的是继承的父类的类名。 最后以冒号结束。

下面是类的语法格式:

class ClassName(superClass):
    <statement>

下面的代码定义了一个名为 Person 的类

class Person:
    pass

定义Person类的时候没有指定它的父类,这样它默认继承object类。

object类是所有类最终都会继承的类

然后通过 类名+() 就可以得到类的实例,也就是对象。

>>> xiaoming = Person()
>>> xiaoming
<__main__.Person object at 0x000001F92F190D90>

这样我们就得到了 xiaoming 这个对象。

可以直接给对象添加属性:

>>> xiaoming.name = 'xiaoming'
>>> xiaoming.name
'xiaoming'

定义类是还可以使用类的构造方法 __init__ 将一些必须绑定的属性添加进去。这样在实例化对象是就必须提供对应的参数。
下面我们改造一下 Person 这个类:

class Person:
    def __init__(self, name, age) -> None:
            self.name = name
            self.age = age
    def getName(self):
            return self.name
    def getAge(self):
            return self.age

改造过的 Person 类共有两个属性,name(姓名)、age(年龄)。两个方法, getName返回对象的name属性,getAge返回age属性。
现在 Person 类实例化对象时就需要添加参数,如下:

>>> xiaoming = Person('小明',18)
>>> xiaoming.name
'小明'
>>> xiaoming.age
18
>>> xiaoming.getName()
'小明'
>>> xiaoming.getAge()
18

注意:无论是类的构造函数 __init__ 还是类里面定义的方法,它的第一个参数永远是 self ,就是对象本身。

类的特殊变量

1、类变量:

类变量在整个实例化的对象中是公用的,定义在类中且在函数体之外。

>>> class Person:
	count = 0
	def __init__(self, name, age) -> None:
		self.name = name
		self.age = age
	def getName(self):
		return self.name
	def getAge(self):
		return self.age

上面 Person 类里面的 count 就是一个类变量。

类变量和实例变量的区别:类变量是类的实例化对象所共有的,实例变量是每个对象独有的。

需要特别注意的是:类中定义的类变量如果是引用类型,例如list和dict时,修改一个类的一个实例化对象的类变量是,别的对象也会被修改

 class Person:
   count = 0
   codes = []
   def __init__(self, name, age) -> None:
   	self.name = name
   	self.age = age
   def getName(self):
   	return self.name
   def getAge(self):
   	return self.age

   
>>> xiaoming = Person('小明',18)
>>> xiaoqiang = Person('小强',25)
>>> xiaoming.codes.append('123')
>>> xiaoming.codes
['123']
>>> xiaoqiang.codes
['123']

从上面可以看到,修改了xiaoming这个对象的codes这个变量时,xiangqiang的codes变量也被修改了。

注:如果对象变量和类变量存在同名的,则会优先查找对象变量

2、私有变量

在对象外部是可以直接通过调用实例变量的方法来操作数据。如果不想让外部直接访问内部数据,就要用到私有变量。

私有变量的格式就是在前面加 __ ,只要在前面加了 __ 变量就变成了了私有变量。这样外部就不能访问了。

class Person:
    def __init__(self,name,age) -> None:
            self.__name = name
            self__age = age
            
>>> xm = Person('小明',15)
>>> xm.name
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    xm.name
AttributeError: 'Person' object has no attribute 'name'
>>> xm.__name
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    xm.__name
AttributeError: 'Person' object has no attribute '__name'

上面的代码定义了一个Person类,定义了两个变量__name和__age。然后实例化了一个对象xm,外部直接访问__name这个变量时,都提示不存在这个变量。那么,这时候我们怎么样访问这个变量呢?

答案是用方法

比如我们要对 __name 这个变量进行操作,我们可以定义set_name和get_name两个方法,在get_name方法返回值,在set_name方法返回值。

class Person:
    def __init__(self,name) -> None:
            self.__name = name
    def set_name(self,name):
            self.__name = name
    def get_name(self):
            return self.__name

>>> xm = Person('小明')
>>> xm.get_name()
'小明'
>>> xm.set_name('小强')
>>> xm.get_name()
'小强'

注:变量名类似__xxx__这样的,以双下划线开头,以双下划线结尾的是特殊变量,可以直接访问的。类似_xxx这样的以单下划线开头的,在外部可以访问,但是最好不要这样做。

小结

  1. 类是对象的模板,对象则是类进行实例化的产物,各个对象拥有的数据都互相独立,互不影响(除了引用类型的类变量);
  2. 方法就是对象内部的函数,方法可以直接访问实例的数据;
  3. object类是所有类最终都会继承的类。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风云长轩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值