程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-05(5)

Python编程 ---面向对象基础

发布于2020-02-26 11:48     阅读(1304)     评论(0)     点赞(26)     收藏(1)


面向对象三要素

封装
组装:将一组数据结构和操作这些数据结构的方法组装到一起
隐藏数据:对外只暴露一些接口,通过接口访问对象。就像开车一样,你不知道车的组成原理,但是知道车辆驱动的方式就行了

继承
多复用:子类能够继承父类或以上的类的方法,这样来自继承类的方法就可以不用自己再编写代码。使代码更加精简。
多继承少修改:能够继承大部分特性,再通过重写的方式来增加一些特色

多态
不同的子类继承父类的同一方法,然后通过重写或者覆盖的方式来增加子类的特色,从而实现多态

类的定义

1.使用关键字class
2.类名建议使用大驼峰方式,本质上是个标识符
3.类定义完成后,会生成一个类对象,绑定到了类名上

class School:
	"""这是个学校类"""
	a = 123
	x = 'abc'
	def __init__(self, name, level):
		self.name = name
		self.level = level
		
	def show_propertites(self):
		return 'name is {}, level is {}'.format(self.name, self.level)


school1 = School('school_a', 'grade_one') #类的实例化
print(school1.show_propertites()) #调用类方法,会有绑定效果
print(school1.a) #访问类属性,公共属性
print(school1.__class__.a) #同上
print(school1.__class__.__dict__['a']) #通过类的字典来访问类属性
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

ax是类变量,也是类属性。类中的方法,变量,还有__doc_-都是类的属性,可以通过类或类字典来访问

1.__init__方法用来进行实例的初始化,第一个位置参数必须是self,也可以是其他能标识符,不过self是默认的标识符
2.init(self, name, grade),括号中包含的是实例的属性,在初始化时必须附带实参,除非这些形参有了默认值
注意
__init__()方法不能有返回值,或者说是返回None

方法绑定
实例在调用类方法的时候,会将实例名以第一位置参数传入,即类方法会代替类方法中的self形参

属性
1.类属性是公有的属性,实例可以通过类、类字典来访问类属性。或者直接通过实例来调用属性,此方式会递归向上去查找
2.实例变量是实例私有的,其他实例和类都不能访问实例的属性

类方法和静态方法

class Person:
    @classmethod
    def class_method(cls):
        print('类方法')
        print("{0}'s name is {0.__name__}".format(cls))

tom = Person()
Person.class_method()
Person().class_method() 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

其实通过类访问类方法或者实例访问类方法,效果都是一样的
类方法
1.在类定义中,使用classmethod修饰的方法就叫类方法
2.类方法至少需要一个参数,且第一参数必须是cls
3.通过cls可以直接操作类的属性

静态方法

class Person:
    HEIGHT = 180
    
    @staticmethod
    def static_method():
        print('静态方法')
        print(Person.HEIGHT)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1.使用staticmethod修饰
2.调用时,不会隐式传入参数
3.通过类和实例都可以调用静态方法

访问控制

私有成员(Private)

class Person:
    def __init__(self, name, age=18):
        self.__name = name
        self.__age = age
    def __showage(self):
        print(self.__age)

tom = Person('tom')
print(tom.__name) #报错
print(tom.__showage()) #报错
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

以双下划线开头的属性不能直接访问,因为python会隐式地改名,因此直接访问时会报错(没有这个属性),对于这些属性会在前面加上_Person这个前缀,比如,__name属性会变成_Person__name),因此若要强制访问这些属性,需要访问改名后的名称,不过不建议这样访问,因为他们是保护成员,原则上在类外部是不能直接访问的,这样就失去了封装的意义。

保护成员

class Person:
    def __init__(self, name, age=18):
        self._name = name
        self._age = age
    def _showage(self):
        print(self._age)
print(Person.__dict__)
tom = Person('Tom')
print(tom.__dict__)
tom._showage()             # 可以访问
print(tom._name, tom._age) # 可以访问
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

保护成员不是python定义的,是程序员之间约定俗成的法则,意义是让外部不要轻易访问这些成员,更不能去修改它们,这样就失去了类的初衷

发布了40 篇原创文章 · 获赞 1 · 访问量 1438


所属网站分类: 技术文章 > 博客

作者:嘴巴嘟嘟

链接:https://www.pythonheidong.com/blog/article/234059/2f34ab360c8e836464a2/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

26 0
收藏该文
已收藏

评论内容:(最多支持255个字符)