python学习day20 面向对象(二)类成员&成员修饰符
1.成员
- 类成员
- 类变量
- 绑定方法
- 类方法
- 静态方法
- 属性
- 实例成员(对象)
- 实例变量
1.1实例变量
- 类实例化后的对象内部的变量

1.2类变量
类中的变量,写在类的下一级和方法同一级。
访问方法:
- 类.类变量名称(推荐)
- 对象.类变量名称

面试题:
- 总结:找变量优先找自己,自己没有找 类 或 基类;修改或赋值只能在自己的内部设置。
class Base:
x = 1 obj = Base() print(obj.x) # 先去对象中找,没有再去类中找。
obj.y = 123 # 在对象中添加了一个y=123的变量。
print(obj.y)
obj.x = 123
print(obj.x)
print(Base.x)
1.3绑定方法/普通方法
定义:至少有一个self参数
执行:先创建对象,由对象.方法()。
class Foo:
def func(self,a,b):
print(a,b) obj = Foo()
obj.func(1,2)
# ###########################
class Foo:
def __init__(self):
self.name = 123 def func(self, a, b):
print(self.name, a, b) obj = Foo()
obj.func(1, 2)
1.4静态方法
- 定义:
- @staticmethod装饰器
- 参数无限制
- 调用:
- 类.静态方法名()
- 对象.静态方法名()不推荐
- 在方法不进行传参时使用
class Foo:
def __init__(self):
self.name = 123
def func(self, a, b):
print(self.name, a, b)
@staticmethod
def f1():
print(123)
obj = Foo()
obj.func(1, 2)
Foo.f1()
obj.f1() # 不推荐
1.5类方法
定义:
- @classmethod装饰器
- 至少有cls一个参数,当前类
执行
- 类.方法()
- 对象.类方法()不推荐
class Foo:
def __init__(self):
self.name = 123 def func(self, a, b):
print(self.name, a, b) @staticmethod
def f1():
print(123) @classmethod
def f2(cls,a,b):
print('cls是当前类',cls)
print(a,b) obj = Foo()
obj.func(1, 2) Foo.f1()
Foo.f2(1,2)
面试题
# 问题: @classmethod和@staticmethod的区别?
"""
一个是类方法一个静态方法。
定义:
类方法:用@classmethod做装饰器且至少有一个cls参数。
静态方法:用staticmethod做装饰器且参数无限制。
调用:
类.方法直接调用。
对象.方法也可以调用。
"""
1.6属性
- 定义:
- @property装饰器
- 只有一个self参数
- 调用:
- 对象.方法 不加括号
class Foo:
@property
def func(self):
print(123)
return 666
obj = Foo()
result = obj.func
print(result)
属性的应用
# 属性的应用 class Page:
def __init__(self, total_count, current_page, per_page_count=10):
self.total_count = total_count
self.per_page_count = per_page_count
self.current_page = current_page
@property
def start_index(self):
return (self.current_page - 1) * self.per_page_count
@property
def end_index(self):
return self.current_page * self.per_page_count USER_LIST = []
for i in range(321):
USER_LIST.append('alex-%s' % (i,)) # 请实现分页展示:
current_page = int(input('请输入要查看的页码:'))
p = Page(321, current_page)
data_list = USER_LIST[p.start_index:p.end_index]
for item in data_list:
print(item)
2.成员修饰符
2.1 公有
公有,所有地方都能访问到。
class Foo:
def __init__(self, name):
self.__name = name def func(self):
print(self.__name) obj = Foo('alex')
# print(obj.__name)
obj.func()
2.2 私有
私有,只有自己可以访问到。
class Foo:
__x = 1 @staticmethod
def func():
print(Foo.__x) # print(Foo.__x)
Foo.func() #---------------------------------------------
class Foo: def __fun(self):
print('msg') def show(self):
self.__fun() obj = Foo()
# obj.__fun()
obj.show()
2.3强制访问私有成员
# 强制访问私有成员
class Foo:
def __init__(self,name):
self.__x = name
obj = Foo('alex')
print(obj._Foo__x) # 强制访问私有实例变量
3.内容补充
py2/3区别:
class Foo:
pass class Foo(object):
pass # 在python3中这俩的写法是一样,因为所有的类默认都会继承object类,全部都是新式类。 # 如果在python2中这样定义,则称其为:经典类
class Foo:
pass
# 如果在python2中这样定义,则称其为:新式类
class Foo(object):
pass class Base(object):
pass
class Bar(Base):
passclass Foo:
def __init__(self,num):
self.num = num cls_list = []
for i in range(10):
cls_list.append(Foo) for i in range(len(cls_list)):
obj = cls_list[i](i)
print(obj.num)
总结:
数据封装
继承关系查找
嵌套
class School(object):
def __init__(self,title,addr):
self.title = title
self.address = addr class ClassRoom(object): def __init__(self,name,school_object):
self.name = name
self.school = school_object s1 = School('北京','沙河')
s2 = School('上海','浦东')
s3 = School('深圳','南山') c1 = ClassRoom('全栈21期',s1)
c1.name
c1.school.title
c1.school.address
# ############################################
v = [11,22,33,{'name':'山海','addr':'浦东'}] v[0]
v[3]['name']
python学习day20 面向对象(二)类成员&成员修饰符的更多相关文章
- python学习之面向对象(二)
6.2 类的空间角度研究类 6.2.1 添加对象属性 [总结]对象的属性不仅可以在__init__里面添加,还可以在类的其他方法或者类的外面添加. class A: address = '召唤师峡谷' ...
- Python学习之==>面向对象编程(二)
一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...
- python基础(27):类成员的修饰符、类的特殊成员
1. 类成员的修饰符 类的所有成员在上一步骤中已经做了详细的介绍,对于每一个类的成员而言都有两种形式: 公有成员,在任何地方都能访问 私有成员,只有在类的内部才能方法 私有成员和公有成员的定义不同:私 ...
- python基础之面向对象(二)
一点提醒 首先在使用pickle读取load时,需要先把使用到的类import上,否则会报错.在pycharm中使用时不会报错,但在linux或者cmd时就会报错!必须import. 报错提示: Fi ...
- python进阶01 面向对象、类、实例、属性封装、实例方法
python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...
- java中的类修饰符、成员变量修饰符、方法修饰符。
类修饰符: public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. fin ...
- VS开发入门三:c#的类的修饰符和成员的修饰符
初学者经常会犯下的错误就是,修饰符一大堆,而且类和其成员很多修饰符是一样的容易混用 这里总结下 C#修饰符之类修饰符(个 助记 PIPA SS ):public.internal. partial(多 ...
- 12、类成员访问修饰符public/private/producted/readonly
1.private 类的私有成员 private 类的私有成员,只能在内部访问,在外部访问不到,无法被继承,我们可以将不需要被外部修改的定义为私有的 私有成员,只能在内部访问,在外部访问不到 priv ...
- Python学习笔记(二)——列表
Python学习笔记(二)--列表 Python中的列表可以存放任何数据类型 >>> list1 = ['Hello','this','is','GUN',123,['I','Lov ...
随机推荐
- jQuery(九)、ajax对象操作
1 数组和对象操作 1.jQuery.extend([deep,] target, object1, [objectN]) 用一个或多个其他对象来扩展一个对象,返回被扩展的对象. 如果不指定targe ...
- JAVA_新建一个方法并且求三个数中的最大值
package wac.wev.as;//新建一个方法在求最大值import java.util.Scanner; public class MaxLian {public static void m ...
- JavaScript常用代码书写规范
javascript 代码规范 代码规范我们应该遵循古老的原则:“能做并不意味着应该做”. 全局命名空间污染 总是将代码包裹在一个立即的函数表达式里面,形成一个独立的模块. 不推荐 , y = ; c ...
- JS添加或删除HTML dom元素的方法实例分析
本文实例讲述了JS代码添加或删除HTML dom元素的方法.分享给大家供大家参考,具体如下: 创建新的 HTML 元素 如需向 HTML DOM 添加新元素,您必须首先创建该元素(元素节点),然后向一 ...
- axios 封装
来自:https://www.jianshu.com/p/68d81da4e1ad 侵删 import axios from 'axios' import qs from 'qs' let baseu ...
- Spark Streaming 快速入门
一.简介 1.便于使用 Spark Streaming将Apache Spark的 语言集成API 引入流处理,使您可以像编写批处理作业一样编写流式作业.它支持Java,Scala和Python. 2 ...
- Linux下载_Linux系统各种版本ISO镜像下载(redhat,centos,oracle,ubuntu,openSUSE)
以下是风哥收集的Linux系统各种版本ISO镜像下载,包括redhat,centos,oracle,ubuntu等linux操作系统. Linux下载1:红帽RedHat Linux(RHEL5.RH ...
- linux 命令基础大全
pwd:显示当前路径 cd :切换目录 用法:cd cd ../ 切换到上级目录 cd / 切换到根目录 cd ~ (或只有cd )切换到当前用户主目录(home底下以用户名命名的文件夹) /r ...
- nexus 10 救砖 安装lineage OS 15 并 root
因为平板自带的谷歌应用太烦人了,想root之后卸载它们. 一.root nexus 10 官方系统 1.把img拷贝到platform-tools(Android官网下载)文件夹 2.platform ...
- samba介绍和安装
samba基本介绍 为什么需要samba 早期网络文件数据在不同主机之间传输大都可以使用Ftp完成,不过ftp使用有个小小的问题,它不能让你之间修改主机上的文件.要想修改必须要通过下载——修改——上传 ...